0%

docker

Docker 简单使用记录

  1. 简明教程
  2. 制作自己的镜像
  3. 深入理解Docker命令
  4. Dockerfile详解

需求

在一台新机器上部署环境、无需浪费生命

简明教程

Step 1

拉镜像

1
$ docker image pull hello-world

国内有Docker的官方仓库,例如:mysql、php、nginx

也可以使用阿里云的Docker镜像,搜索 容器镜像服务,使用前本地需要先设置访问凭证

拉取成功后,就可以看到了

1
$ docker image ls

Step 2

生成实例

1
$ docker container run hello-world

该命令具有自动抓取image文件的功能,所以可以省略上一步

1
$ docker container run -it swoole bash

有些容器提供的是服务,可供在命令行使用,但不会自动终止

Step 3

终止|删除容器

1
2
$ docker container kill containerID
$ docker container rm containerID

此命令并不会删除image文件,因为镜像和容器的概念是不同的

到目前为止你完全可以使用Docker进行开发、测试、部署自己的代码了

以下内容会介绍docker的深入使用

制作自己的镜像

Step 1

编写两个文件

  • .dockerignore 写入你要忽略的文件

    1
    2
    3
    .git
    node_modules
    npm-debug.log
  • Dockerfile 写入一些配置参数

    1
    2
    3
    4
    FROM hello-world
    COPY . /app
    WORKDIR /app
    EXPOSE 3000
    • FROM:以一个镜像为基础,在其上进行定制。是必备的指令,并且必须是第一条。

      特殊的空白镜像:FROM scratch 意味着不以任何镜像为基础,接下来写的指令作为镜像的第一层

    • COPY:复制文件到镜像

    • WORKID:指定工作目录

    • EXPOSE:暴露端口

Step 2

构建镜像命令 (此外还有多阶段构建)

1
$ docker build -t my-hello-world .

参数 -t 表示指定image文件名字, 点. 表示当前路径

Step 3

发布镜像

1
$ docker login --username=xxx (可指定仓库域名)

打tag

1
$ docker image tag [imageName] [username]/[repository]:[tag]

然后push到仓库上

1
$ docker image push [username]/[repository]:[tag]

深入理解Docker命令

Commit

在解释commit的作用前,先看一段话:

镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。

当我们想修改官方nginx容器的主页内容时,进入已经启动的容器,修改nginx的index.html。

然后:

1
2
3
4
5
6
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
docker commit \
--author "ajsonx<ajsonx@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2

重要的两段话:

docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。如果你想要定制镜像请查看下一小节。

​ 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。

查看镜像内的历史记录:

1
$ docker history nginx:v2

Container

Container作为操作容器的入口,有很多重要的命令,以下一一来介绍

run

run后面可带的参数非常多,也十分常用,需要理解和记忆

1
2
3
4
5
6
7
8
9
10
11
>  $ docker container run \
> -d \
> -p 127.0.0.2:8080:80 \
> --rm \
> --name wordpress \
> --env WORDPRESS_DB_PASSWORD=123456 \
> --link wordpressdb:mysql \
> --volume "$PWD/wordpress":/var/www/html \
> wordpress
>
>
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • –rm: 停止运行后该容器文件会被自动删除
  • –volume , -v: 绑定一个卷
  • –link=[]: 添加链接到另一个容器;
  • –name=”nginx-lb”: 为容器指定一个名称;
  • –env MYSQL_ROOT_PASSWORD=123456:向容器进程传入一个环境变量MYSQL_ROOT_PASSWORD,该变量会被用作 MySQL 的根密码。

star

启动容器服务,启动已经生成的容器文件,非run命令的创建

1
2
> $ bash container stop [containerID]
>

stop

前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。

1
2
> $ bash container stop [containerID]
>

这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。

logs

docker container logs命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。

1
2
> $ docker container logs [containerID]
>

exec

docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。

cp

docker container cp命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。

1
2
> $ docker container cp [containID]:[/path/to/file] .
>

以上Container详解引用自阮一峰老师,文末有他的文章链接,更加完整

Dockerfile详解

指令

  • todo

多阶段构建

  • todo

参考文章