一、Docker的镜像仓库

镜像仓库的概念就和YUM仓库一样,仓库里面存放了各种镜像,比如Centos系统镜像、Redis镜像、MySQL镜像等。由于Docker服务默认使用的镜像仓库是docker hub,该仓库地址(https://hub.docker.com/)在国外,存在速度慢的问题。建议配置阿里云或者清华大学的镜像仓库。以阿里云为例,只需要登录阿里云控制台--容器镜像服务,就可以看到一个自己专属的镜像仓库地址,甚至连怎么配置的命令都给写了出来,如图

 

1. 国内加速地址

  • Docker中国区官方镜像 https://registry.docker-cn.com
  • 网易  http://hub-mirror.c.163.com
  • ustc  https://docker.mirrors.ustc.edu.cn
  • 中国科技大学  https://docker.mirrors.ustc.edu.cn
  • 阿里云容器 服务  https://cr.console.aliyun.com/

首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com”

2.镜像仓库配置完成后重启docker并使用docker info命令查看下是否生效

vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl daemon-reload
systemctl restart docker

docker info

二、Docker镜像管理常用命令介绍

从Docker分为CE版和EE版开始,命令行也发生了变化。CE版本中对命令进行了分组,并且支持命令补全,包括版本号都可以自动补全。使用docker --help命令可以看到Management Commands下包含了一些组,每个组下又包含了许多子命令。所以在新版本中运行命令的方式是docker+组名+子命令的方式,而老版本中直接是“docker+子命令”。虽然为了兼容性支持以前的命令格式,但是推荐使用新的管理方式。

docker container create  #新格式
docker create  #老格式
docker container --help  #查看指定组所支持的子命令

1、查看当前系统中的镜像

使用docker images命令查看当前系统中所有镜像的基本信息,如镜像ID、创建时间、镜像大小等

docker国内镜像库地址 docker镜像仓库地址_Docker

 

2、搜索镜像

使用docker search命令可以在默认的镜像仓库docker hub中进行镜像搜索,搜索结果中没有带用户名信息的镜像通常是官方镜像

docker search nginx

# INDEX代表了镜像来源于哪个仓库,默认是docker.io
# NAMES:镜像的名字,如果名字没有用/分割代表是顶级仓库,通常是官方提供的镜像。而带/的前面是用户名,后面才是镜像名,后续安装和启动都需要用到这个名字
# DESCRIPTION:镜像的描述信息 
# STARS:是获得的星数,也就是评分或热门程度
# OFFICIAL:官方认证

docker国内镜像库地址 docker镜像仓库地址_nginx_02

 

3、下载镜像

使用docker pull命令从指定的公网仓库中下载指定的Docker镜像,如果一个镜像存在多个版本,需要先到Docker Hub中确认每个版本的标签才能正确的下载

#命令格式
#docker pull [registry地址[:端口]/]镜像名:标签  #registry是仓库地址,默认为dockerhub;镜像名完整格式是<用户名>/<镜像名>,用户名不写的话默认使用官方镜像;镜像标签默认为latest
docker pull nginx  #从dockerhub中下载官方nginx镜像
docker pull bitname/wordpress  #从dockerhub下载bitname所提供的wordpress镜像
docker pull quay.io/coreos/flannel:v1.1  #从quay.io这个公网仓库的coreos名称空间中下载镜像flannel镜像,标签为v1.1

docker国内镜像库地址 docker镜像仓库地址_docker_03

 

4、删除镜像

使用docker rmi命令可以通过镜像名字或者ID来删除已下载的Docker镜像

docker rmi 688353a31fde

docker国内镜像库地址 docker镜像仓库地址_docker配置镜像仓库_04

 

三、Docker容器管理常用命令介绍

1、运行容器

使用docker run命令可以将镜像运行成为容器,如果镜像不存在于本地的话会自动去仓库中下载。该命令包含了许多子选项:

    -d:以后台方式运行容器,该选项需要配合-i、-t选项一起使用,使用该选项后exit退出容器也不影响里面运行的程序

    -it:这里包含了i和t两个选项,代表使用交互方式打开一个容器的终端以便执行命令

    -e:定义容器启动后的环境变量

    --dns:自定义容器的DNS地址

    --name:定义容器本身的名字

    --hostname:定义容器运行后的主机名,否则会使用容器的ID作为主机名

    --network:指定容器的网络,常用于容器跨主机通信

    --add-host:为容器的hosts文件增加记录

    --rename :修改容器名字

#使用docker ps命令可以看到命令后的名称
docker run -it --name=centos_test --hostname=server1 centos /bin/bash  #/bin/bash是让容器保持运行这个进程,也可以是以前台方式启动其他服务,以免容器状态结束

docker国内镜像库地址 docker镜像仓库地址_docker_05

 

-p:宿主机与Docker容器的端口映射,实现容器端口暴露到宿主机上,这样访问物理机端口就可以访问到容器中的服务,该选项可多次使用。比如在容器中安装Nginx,然后把80端口映射到宿主机上的任意端口,然后通过宿主机就可以访问到容器中的服务。使用netstat命令或者docker ps命令、docker port命令都可以查看到端口映射关系,使用iptables命令还可以看到自动创建好的转发规则。 

#把容器中80端口映射到物理机8000端口,如果容器监听了多个端口就暴露多次
docker run --name test_nginx --rm -p 80 linuxe # 不写宿主机端口则是一个随机端口
docker run --name test_nginx --rm -p 8000:80 -p 3306:3306 linuxe  #宿主机端口为8000,网络接口为ALL
docker run --name test_nginx --rm -p 192.168.1.100:8000:80 linuxe  #指定了网络接口

docker port nginx #查看nginx容器的端口映射关系

--restart:Docker容器的自启动,使用该选项后容器会跟随宿主机的启动而自我启动。该选项默认值是no,改为yes即可 

docker run -itd --restart=yes  -name=centos_docker1 docker.io/ansible/centos7-ansible /bin/bash

 --rm容器命令运行后自动删除容器。常用于云主机环境,需要短期且大量的Docker虚拟机工作,工作完成后自动销毁 

docker run -it --rm --name test docker.io/centos sleep 5  #sleep 5执行完毕后就会删除这个镜像

--link:会在hosts文件中为指定的容器做一个解析记录,常用于不同容器之间的互通,免去手动配置IP 

docker run -it --link nginx:web nginx:lastert /bin/bash  #nginx为另一个容器的名字,web为这个容器的别名,ping web这个名字可以看到nginx这个容器的IP

#nginx容器和mysql、zabbix互通
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix" \
      -e MYSQL_ROOT_PASSWORD="zabbix" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 8080:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

2、容器的启动、停止、重启与杀死,需要注意的是启动其实是创建和运行的结合,也就是docker create+docker start——docker container start、docker container stop、docker container restart、docker container kill  

docker container restart nginx_docker
docker container kill test_nginx

3、有时候需要暂停容器工作一段时间,比如进行快照、暂时释放宿主机资源——docker pause、docker unpause 

docker pause centos:v1 #pause后不暂用宿主机资源
docker unpause centos:v1

4、容器元信息等其它信息的查看——docker container ps、docker container inspect、docker container port

docker ps命令用来查看正在运行的容器信息,加上-a选项可以查看已经退出的容器;docker port命令可以查看容器端口的映射信息;docker inspect命令可以查看容器更详细的底层信息,如容器运行后默认执行什么命令(cmd)、每个容器的IP信息(这就是为什么能通过宿主机访问容器中服务的原因,在安装了Docker后网卡配置里多了一个docker0的网卡,之后建立的容器都是跟该网卡在一个网段内,默认是172.段),如果想获取某一个大类下的子类信息,使用语法:

docker container inspect -f {{.NetworkSettings.IPAddress}} nginx  #获取nginx容器下的IP信息,可以精确到小类
docker port test_nginx  #查看端口映射情况

docker国内镜像库地址 docker镜像仓库地址_docker配置镜像仓库_06

 

5、Docker容器的进入与退出——docker container attach、docker container exec

进入容器有2种方法,docker attach和docker exec,然后跟上容器的名字或者ID即可。

docker exec -it 775c7c9ee1e1 /bin/bash

docker国内镜像库地址 docker镜像仓库地址_docker_07

 

attach与exec的区别:attach直接进入容器正在运行的命令中,不会启动新的进程,比如容器是在执行一个无限循环进行输出,那attach进入后则会看到这些输出信息。而exec则是开启一个新的终端,并且可以启动新的进程。如果想直接在终端中查看启动命令的输出用attach,其他情况都使用exec即可。

 

容器运行后如果要退出的话,不要使用exit命令来退出终端,这样容器状态会成为exitd状态,里面的服务也就无法正常使用了。需要使用ctrl+p+q这样的组合键进行退出,这样可以保持容器状态是UP。如果容器已经是exitd状态,通过docker start命令启动来恢复运行

docker国内镜像库地址 docker镜像仓库地址_docker配置镜像仓库_08

 

6、给镜像打标签——docker tag命令 

docker tag 38baaxh26s6661 tanglu/centos:v1.1  #给一个没有标签的镜像打上标签,这里没有写仓库地址,默认是dockerhub,完整格式就是dockerhub/tanglu/centos:v1.1
docker tag tanglu/centos:v1.1 tanglu/centos:v1.2  #修改标签

7、删除Docker容器

如果要删除已经停止的容器则使用docker rm命令,删除镜像的话使用的是docker rmi命令,跟上镜像名称或者ID都可以删除。如容器没有停止的话是无法直接删除的,需要加上-f选项或者先停止掉容器,使用命令是docker stop或者docker kill,然后跟上ID或者镜像名称,停止后再执行删除就可以了。

docker国内镜像库地址 docker镜像仓库地址_docker配置镜像仓库_09

 

8、查看镜像的构建过程——docker history命令 

docker histrosy image_name

9、从宿主机复制文件到容器(也可以反向操作)——docker cp命令 

docker cp index.html 770fbbsagi:/usr/local/nginx/html/