[docker]2.docker命令的使用

本文的目的

通过与git平台进行类比,快速理解和使用docker相关的命令。

1. Docker命令介绍

在Docker的使用过程中,我们需要使用Docker提供的命令与Docker进行对话,以便告诉Docker我们要完成的操作。

这些操作,可以与git或者svn的使用进行类比,因为道理都是从一个仓库中拉取相关的内容,然后进行操作。

2. 快速入门

2.1 拉取一个镜像

docker pull hello-world

2.2 查看本机已有的镜像

docker images

2.3 通过镜像运行成一个容器

docker run --name hello-world-01 hello-world

2.4 查看已经运行过的所有镜像(包含正在运行的)

docker ps -a

2.5 重新启动已有的容器

docker start hello-world-01

3. Docker镜像命令

3.1 docker pull

3.1.1 功能

通过该命令拉取网络上存在的一个镜像资源,这个功能可以和git上的clone进行类比,都是从网络上拉取资源的,并且也可以通过指定路径的资源,拉取到相关的镜像。

3.1.2 示例

  1. 拉取官方registry的镜像:docker pull hello-world或者docker pull centos7

  2. 拉取指定位置的镜像:docker pull docker.imopei.cn:5000/java8

    类比一下Git的方式:git clone https://github.com/spring-projects/spring-framework.git

    当然关键字pull和git的pull不一样,前者是相当于clone的功能,后者只是对分支上的更新

3.2 docker images

这个没什么好说的,就是列出来本机上面已经拉取到的镜像。

3.3 docker run {image-name | image-id}

功能

通过已有的镜像(本机或者网络上),调用run命令,docker会先从本机上寻找,如果本机不存在则从网络上(默认官方仓库)寻找,如果网络上存在,先下载后启动,如果网络上不存在则报错。

这一步也是生成容器的一个关键,每run一次镜像就会生成一次容器(java每new一次就生成一个对象),按照经验来说,我们只需要调用几次,后面通过start容器来进行复用即可。

最简单的run命令:docker run hello-world

3.3.1 指定镜像运行时容器的名字

一般来说,如果我们不指定容器的名字,那么控制容器的时候我们就需要先通过查询语句查询容器的ID,再使用该ID进行相对应的操作,而指定名字,可以让我们更清楚的标识容器,也可以通过名字来进行容器的操作。

docker run --name hello-world-01 hello-world

然后通过docker ps -a可以查询到容器的名字。

3.3.2 指定镜像运行的参数

有许多镜像,通过将程序的参数抽取到运行的时候指定,这时候我们只需要通过指定参数就可以获取到相对应参数的容器,而参数的查找可以通过官方store进行查询。

比如,指定MySQL的ROOT密码:

docker run -e MYSQL_ROOT_PASSWORD=root mysql

当有多个的时候,只需要指定多个-e key=value即可

如:docker run -e k1=v1 -e k2=v2 mysql

3.3.3 指定镜像自动重启

当我们的Docker因为修改配置需要重启,或者因为电脑宕机需要重启电脑的时候,Docker一般来说是自启动的,那么我们正在运行的容器默认是不会自启动的,通过设置我们可以让容器跟随Docker的启动而自动启动。

示例:docker run --restart=always hello-world

这样一来我们的容器就可以自动重启了。

3.3.4 指定镜像映射端口

默认docker容器运行的时候是没有映射端口的,需要我们手动去指定,同样需要映射什么端口去官方store进行查询,一般来说都是默认端口的映射,比如MySQL的3306,redis的6379。

示例:

docker run -p 80:80 -p 443:443 -d nginx

通过-p指定需要映射的端口,前面的端口是宿主机的端口,后面的端口是容器里的端口,意思就是我们可以把默认的比如6379映射到主机的16379,就可以实现修改端口的功能。

同理当我们需要映射多个端口的时候可以像指定多个参数那样子去指定多个端口。

3.3.5 指定镜像运行文件映射

镜像运行的时候需要用到的配置文件,或者我们需要查看镜像运行时的日志文件,这个时候我们可以把我们需要的映射的文件路径给指定到宿主机上,以方便我们能够快速查看或者修改相关的文件。

示例:

docker run -v /home/imopei-admin/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /home/imopei-admin/nginx/log:/var/log/nginx:rw \
-v /home/imopei-admin/nginx/conf/host.conf:/etc/nginx//conf.d/default.conf:ro \
nginx

有些文件只可以只读,我们通过后面指定的ro或者rw进行控制,rw就是表示文件是可以读写的。

3.3.6 指定镜像运行的使用内存

我们默认运行的容器内存占用是不受控制的,但是往往很多情况下一个进程占用过多会影响另外一个进程,所以通常我们都会对内存的使用进行控制,通过-m 100m这样的方式进行控制。

示例:

docker run -m 100m hello-world

这样我们即可对容器运行的程序进行资源上的控制。

PS:如果指定 -m 内存限制时不添加 --memory-swap 选项,则表示容器中程序可以使用 100M 内存和 100M swap 内存。

3.3.7 指定镜像连接另外的镜像

一个程序我们运行的时候往往需要连接到另外的一个容器去配合运行,比如著名的博客程序WordPress,他就需要连接到MySQL容器进行数据的存储,这时候我们可以通过设置连接或者直接映射到本机端口进行通讯,当然我感觉通过连接的方式更加的优雅。

docker run -P --name web --link db:db wordpress

这样我们就没有必要为名为db的容器进行端口的暴露,只要让容器之间进行连接即可获取想要的功能,安全性可谓更高一点。

关于更多连接的内容,后面还会再讲,此处先不使用也无所谓。

3.3.8 静默启动

默认没有指定静默的情况下,运行容器是会在控制台输出情况的,但是更多时候我们想要让容器静默的在后台进行运行,这时候只要指定-d参数即可。

示例:

docker run -d hello-world

3.4 docker push {image-name | image-id}

当我们已经构建好我们自己的自定义镜像以后,我们一般是想把这个镜像上传到我们的中央仓库里面去,以便能够供多态服务器之间进行拉取启动,这时候我们就可以使用和git一样的push功能,将仓库push到中央仓库上面去。

需要注意的是,我们的镜像名需要有我们自己仓库的位置,比如:docker.imopei.cn:5000/spring-cloud-eureka,如果没有默认会上传到官方仓库上面。我们当然的,根本不想要自己内部镜像上传到上面公开,所以切记需要带上仓库的位置。

docker push docker.imopei.cn:5000/spring-cloud-eureka

4. Docker容器命令

4.0 查看所有的容器

docker ps -a

如果不加上-a的参数,则是查询当前正在运行的docker容器。

4.1 docker start|stop|restart {container-id | container-name}

启动|关闭|重启 docker容器

4.2 docker logs {container-id | container-name}

查看容器运行时的日志,在我们的docker-file中会定义启动的程序,那么日志就是默认输出的内容。

4.3 docker stats {container-id | container-name}

在宿主机查看docker使用cpu、内存、网络、io情况

4.4 docker inspect {container-id | container-name}

用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等

4.5 docker top

查看docker容器的运行状况,类似于任务管理器。

4.6 进入容器: docker exec -it {container-id | container-name} /bin/sh

可以进入容器内部运行所需要的命令。

4.7 与宿主机相互拷贝文件

有的时候我们需要把配置文件放在宿主机指定位置上,然后通过上面的路径映射去读取我们宿主机上的内容。这时候就可以先从容器中把我们想要的配置文件拷贝到宿主机上,然后进行相对应的配置再连接启动。

从主机复制到容器docker cp host_path containerID:container_path
从容器复制到主机docker cp containerID:container_path host_path

示例:

docker cp nginx:/etc/nginx /home/myconf/nginx

5. 一个程序运行的实例

我将使用著名的php博客程序WordPress来进行演示,包含参数的设定,连接到数据库容器进行配置,最后成功运行。我想这样子能够加深对上面参数使用的理解。

WordPress是一个开源的博客程序,任何人都可以通过购买共享空间来快速搭建一个属于自己的博客,如我的博客(http://c.liweidan.cn)就是通过WordPress进行搭建的,他也包含了丰富的后台管理,也有很多好看的主题可以让我们自己搭配。

5.1 准备

我们需要两个镜像,一个是MySQL,一个是WordPress

docker pull mysql
docker pull wordpress

5.2 查看镜像使用说明

最好两个镜像的内容都进行查看,因为我先查看WordPress镜像发现如果我自己连接MySQL镜像的时候,他会帮我把一切事情做好。

其实不用害怕看不懂上面的使用说明的,一般来说外文的网站更注重阅读体验,当我们读不懂的时候他们更加害怕,所以如果真的基本单词都看不懂的话,推荐通过浏览器的翻译功能来进行翻译。

接下来阅读MySQL的使用说明,通过设置参数来启动,在这里看来只需要设置一个root密码即可。

所以我们编写需要启动的shell:

docker run --restart=always --name wp-mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql

接下来,直接使用上面WordPress官方使用中的命令拷贝过来进行定制化

docker run --restart=always --name my-wordpress \
--link wp-mysql:mysql \
-d wordpress

5.3 进行启动

接下来,我们先启动MySQL数据库容器:

~ docker run --restart=always --name wp-mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql
f1da40e344feeb90a822aa28fcd8b3fd74cbced750a4b61f85309e7612fb800a
➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f1da40e344fe        mysql               "docker-entrypoint.s…"   2 seconds ago       Up 2 seconds        3306/tcp            wp-mysql

通过查看进程显示已经正常运行的时候,再启动WordPress容器:

~ docker run --name my-wordpress --link wp-mysql:mysql -p 8080:80 -d wordpress
825116e000cc9fb03b0bc97df6bbedafc1faff47161c89213b760e0bbe25f303
➜  ~ docker logs my-wordpress
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
[Sat Apr 14 13:41:29.023555 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.4 configured -- resuming normal operations
[Sat Apr 14 13:41:29.023631 2018] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

好了,接下来请求http://localhost:8080/,看是否能够进入博客的安装界面:

安装完成后,即可开始使用这个博客程序: