镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环 境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变 量和配置文件。将所有的应用和环境直接打包为 docker 镜像,就可以直接运行。
容器是应用程序层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一 台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为孤立进 程运行。容器占用的空间少于虚拟机(容器映像的大小通常为几十 MB),并且几乎 立即启动。通俗的说容器就是运行起来的镜像。
docker load 是 docker 用于将保存好的镜像文件导入 docker 内部的命令,用法:
docker pull 是用于从镜像仓库中获取镜像的命令,大部分的公开镜像都能在https://registry.hub.docker.com/ 中找到,通常所看到的 docker镜像如下几部分组成:
<镜像仓库地址>/<镜像储存位置>/<镜像名>:<镜像版本>
如 registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1 则意味着该镜像是从地 址为 registry.cn-beijing.aliyuncs.com 的镜像仓库的 yunfutech 位置储存的名为 be-exec 的镜像的 centos-1.0.1 版本。
完整命令如下:
docker pull # 为需要获取的镜像
docker images 是用于查看 docker 内已有镜像的命令执行结果如下
docker rmi 是用于删除 docker 镜像的命令,用法如下:
docker rmi
…
#为需要的删除的镜像
docker rm 是用于删除容器的命令
docker rm
一般情况下,此命令只能删除休眠或者停止的容器。
在必要时可以使用一下命令强制删除:
docker rm -f
docker ps 是查看 docker 容器的命令可以直接使用,docker ps -a 则查看所有
docker run 是利用镜像新建容器的命令,命令使用方法如下:
docker run
中必须的参数:
序号 | 参数 | 释义 |
---|---|---|
1 | -it 或 --interactive --tty | 使容器变得可以与外界交互,并在容器内形成一 个伪终端,使进程可以在容器内运行。 |
中的常用可选参数:
命令示例如下(后续示例中大部分会使用 registry.cn-beijing.aliyuncs.com/yunfutech/be- exec:centos-1.0.1 镜像,真实使用时此处可以为任意镜像,对应使用方法中的, 且 docker run 到镜像名之间的参数对应,镜像后的参数为且 大部分情况下可以不写这一部分,示例均为经常使用的方式):
示例1(在后台启动一个容器):
docker run
-it -d --name test1 \
registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1
docker ps -a 查看
可以看到容器已经启动,而容器内的运行指令,启动命令模板的为 /bin/sh start.sh,这是因为容器启动的镜像在构建的过程中可以加入 entrypoint 参数和 cmd 参数用于初始化容器运行,当然 entrypoint 和 cmd 都可以为空,在启动命令没有 参数及中—entrypoint 配置时,容器启动后尝试启动的进程为 enytrypoint + cmd 而在具有相关参数时,尝试启动进程的命令中–entrypoint 后参数会替 换镜像原有的 entrypoint,而则会替换 cmd,验证如下:
docker rm -f test1
#删除前一步建立的容器,后文会详细介绍
docker run \
-it --name test1
–entrypoint=echo \
registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1 \
-e “this is a test\ntest command”
执行结果如下:
示例2(启动并进入一个容器):
docker run
-it --rm --name test2 --entrypoint=bash
registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1
查看系统型号
cat /etc/centos-release
可以看到由 CentOS Linux release 7.9.2009 (Core)系统中的/root 路径变为了容器内 CentOS Linux release 7.6.1810 (Core)操作系统中的/app 目录。
由于添加了–rm 参数,使用 ctrl+d 快捷键可以直接推出并删除容器
这里需要引入一个概念,及镜像的 workdir,即镜像所容器的工作路径,容器在构 建成功时会具有一个默认的 workdir 参数,决定容器内执行进程启动命令的位置。如把 命令改为如下命令:
docker run
-it --rm --name test2 --entrypoint==bash --workdir /home
registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1
示例3 (将外部文件挂载入容器的同时赋予一个环境变量启动并进入一个容器):
mkdir /home/test
#建立文件夹/home/test
cd /home/test
echo “file for test”>> test.txt
#在/home/test 中建立测试用文件 test.txt
docker run \
-it --rm --name test3 --entrypoint=bash \
-v /home/test:/app \
-v /home/test/test.txt:/volume_test/test.txt \
-v /home/test/test.txt:/volume_test/test_rename.txt \
-e “TEST_ENVIRONMENT=test env”
registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1
验证如下:
可以看到外部的/home/test 变成了内部的/app,/home/test/test.txt 出现在了三个不同 的位置且可以为在更改名字的同时仍然具有相同内容。
修改文件测试:
echo “change content test” >> test.txt
命令为容器内的/app/test.txt 插入了一条内容,挂载验证如下:
这说明,三处的文件,尽管路径不一致或者名称不一致,但其为相同文件。
示例 3(将容器内的端口映射到外部,为了便于演示,这里的内外部端口不通,在实 际使用时可以为相同端口,此处镜像改用 mariadb:10.4.4):
docker run \
-it --rm -d --name test4 --privileged \
-p 13306:3306 \
-v /home/data:/var/lib/mysql \
-e “MYSQL_ROOT_PASSWORD=test123456” \
-e “MYSQL_DATABASE=test” \
mariadb:10.4.4 \
–character-set-server=utf8mb4
–collation-server=utf8mb4_unicode_cidocker exec -it test4 bash
#使用 bash 进入容器,后文会有详细介绍
lsof -i:3306
可以看到容器内部的 3306 端口已经被 mysql 进程占据了。
docker exec 是用于从服务器命令行中进入容器的命令,且不会直接影响容器内运行的 进程,命令如下:
docker exec -it
使用 docker ps 查询出来的容器名字或 id 信息即可进入任意存活容器。此处的 command 在/bin/sh,/bin/bash,sh,bash 等命令行类型中选择
docker inspect 是用于获取一个容器所有的配置信息的命令
docker inspect <container name 或 container id>
docker logs 是用于获取一个容器日志信息的命令
docker logs <container name 或 container id>
打印最大保存数量的日志
可选参数释义:
-f 持续打印日志
–tail 打印最后行的日志
docker network 是用于建立 docker 网络的命令,由如下几个命令构成:
docker network ls
#查看已有 docker 网络信息
docker network create <net name>
#建立一个新的 docker 网络
docker network rm <net name>
#删除一个 docker 网络
Docker network inspect <net name>
#查看 docker 网络信息
docker 网络中的容器可以抛弃对宿主机 ip 的要求,转而使用内部网络通信,从而使启 动的服务能够在任意有 docker 的服务器中运行,示例如下:
docker network create test-net
docker run \
-it --rm -d --name test-mysql --privileged \
–network test-net \
–expose 3306 \
-v /home/data:/var/lib/mysql \
-e “MYSQL_ROOT_PASSWORD=test123456” \
-e “MYSQL_DATABASE=test” \
mariadb:10.4.4 \
–character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cidocker run \
-it -d --name test-centos \
–network test-net \
–entrypoint=bash \
registry.cn-beijing.aliyuncs.com/yunfutech/be-exec:centos-1.0.1 19
命令中创建了一个 docker 网络 test-net 和两个加入了网络的容器,则容器 test-centos 就能够直接使用 test-mysql:3306 的地址访问到声明了 3306 端口的 mysql 服务,而由 于只进行了端口声明未进行映射,启动的 mysql 无法直接被宿主机访问到。
docker commit 是用于临时将容器发布成镜像的命令,但其发布的镜像会丢失容器所使 用镜像的容器内用户,entrypoint,workdir 及 cmd 信息。不推荐使用此种方法:
docker commit
:
通过此命令即可将容器发布成名为版本为的镜像。
正式的镜像发布可以通过学习 dockerfile 的编写实现。