DockerFile官方文档

Dockerfile的基本结构

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用 -f 标志指向文件系统中任何位置的Dockerfile。
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行
Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令。

Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声
明以 # 字符开头则被视为注释。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指令。

Dockerfile 有以下指令选项:

  • FROM
  • MAINTAINER
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD

    1.1 FROM

    用法:

    1. FROM <image>

    或者

    1. FROM <image>
  • FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。

  • FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
  • FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。
  • 如果FROM语句没有指定镜像标签,则默认使用latest标签。

    1.2 MAINTAINER

    用法:
    MAINTAINER
    指定创建镜像的用户
    RUN 有两种使用方式

  • RUN

  • RUN “executable”, “param1”, “param2”

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制
exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量,如:

  1. RUN [ "echo", "$HOME" ]

这种方式是不会达到输出 HOME 变量的,正确的方式应该是这样的

  1. RUN [ "sh", "-c", "echo", "$HOME" ]

RUN产生的缓存在下一次构建的时候是不会失效的,会被重用,可以使用—no-cache选项,即docker build —no-cache,如此便不会缓存。

1.3 CMD

CMD有三种使用方式:

CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。
CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了,这个初学者容易弄混这个概念,这里简单注解一下。

1.4 EXPOSE

  1. EXPOSE <port> [<port>...]

告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。

1.5 ENV

  1. ENV <key> <value> # 只能设置一个变量
  2. ENV <key>=<value> ... # 允许一次设置多个变量

指定一个环节变量,会被后续RUN指令使用,并在容器运行时保留。
例子:

  1. ENV myName="John Doe" myDog=Rex\ The\ Dog \
  2. myCat=fluffy

等同于

  1. ENV myName John Doe
  2. ENV myDog Rex The Dog
  3. ENV myCat fluffy

1.6 ADD

  1. ADD <src>... <dest>

ADD复制本地主机文件、目录或者远程文件 URLS 从 并且添加到容器指定路径中 。
支持通过 Go 的正则模糊匹配,具体规则可参见 Go filepath.Match

  1. ADD hom* /mydir/ # adds all files starting with "hom"
  2. ADD hom?.txt /mydir/ # ? is replaced with any single character
  • 路径必须是绝对路径,如果 不存在,会自动创建对应目录
  • 路径必须是 Dockerfile 所在路径的相对路径
  • 如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制
  • 在使用该指令的时候还可以加上 --chown=<user>:<group> 选项来改变文件的所属用户及所属组。
    1. ADD --chown=55:mygroup files* /mydir/
    2. ADD --chown=bin files* /mydir/
    3. ADD --chown=1 files* /mydir/
    4. ADD --chown=10:11 files* /mydir/

1.7 COPY

  1. COPY <src>... <dest>

COPY复制新文件或者目录从 并且添加到容器指定路径中 。用法同ADD,唯一的不同是不能指定远程文件 URLS。

注: 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。
ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。

因此在 COPYADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD

1.8 ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run —entrypoint选项。
每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。

Exec form ENTRYPOINT 例子

通过ENTRYPOINT使用 exec form 方式设置稳定的默认命令和选项,而使用CMD添加默认之外经常被改动的选项。

  1. FROM ubuntu
  2. ENTRYPOINT ["top", "-b"]
  3. CMD ["-c"]

通过 Dockerfile 使用ENTRYPOINT展示前台运行 Apache 服务

  1. FROM debian:stable
  2. RUN apt-get update && apt-get install -y --force-yes apache2
  3. EXPOSE 80 443
  4. VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
  5. ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Shell form ENTRYPOINT 例子

这种方式会在/bin/sh -c中执行,会忽略任何CMD或者docker run命令行选项,为了确保docker stop能够停止长时间运行ENTRYPOINT的容器,确保执行的时候使用exec选项。

  1. FROM ubuntu
  2. ENTRYPOINT exec top -b

如果在ENTRYPOINT忘记使用exec选项,则可以使用CMD补上:

  1. FROM ubuntu
  2. ENTRYPOINT top -b
  3. CMD --ignored-param1 # --ignored-param2 ... --ignored-param3 ... 依此类推

1.9 VOLUME

  1. VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,后续具体介绍。

1.10 USER

  1. USER daemon

指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。

1.11 WORKDIR

  1. WORKDIR /path/to/workdir

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

  1. WORKDIR /a
  2. WORKDIR b
  3. WORKDIR c
  4. RUN pwd

最终路径是/a/b/c。
WORKDIR指令可以在ENV设置变量之后调用环境变量:

  1. ENV DIRPATH /path
  2. WORKDIR $DIRPATH/$DIRNAME

最终路径则为 /path/$DIRNAME。

1.12 ONBUILD

  1. ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
例如,Dockerfile 使用如下的内容创建了镜像 image-A:

  1. [...]
  2. ONBUILD ADD . /app/src
  3. ONBUILD RUN /usr/local/bin/python-build --dir /app/src
  4. [...]

如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。

  1. # Automatically run the following
  2. ADD . /app/src
  3. RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。

docker build命令

docker build 命令用于使用 Dockerfile 创建镜像
语法

  1. docker build [OPTIONS] PATH | URL | -

常用参数

—build-arg=[] :设置镜像创建时的变量;
-f :指定要使用的Dockerfile路径;
—rm :设置镜像成功后删除中间容器;
—tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

要求

  • 每条保留字指令都必须为大写字母且后面要跟随至少要一个参数 如:FROM 后面不能空着,否则报空指针
  • 指令按照从上到下,顺序执行
  • 表示注释

  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

DockerFile大致流程

  1. docker 从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似 docker commit 的操作提交一个新的镜像层
  4. docker 再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile 中的下一条执行直到所有的指令都执行完成

总结
从应用软件的角度来看,DockerFile、Docker镜像和Docker容器分别代表软件的三个不同阶段

  1. DockerFile 是软件的原材料
  2. Docker镜像是软件的交付品
  3. Docker 容器可以认为是软件的运行 状态

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则设计部署与运维,三者缺一不可,合力充当Docker体系的基石。

示例:

测试默认使用centos 镜像启动一个容器进入,查看基本的常用的命令都是不存在的,例如ifconfig ip vim 之类的
image.png
那么与常用的基本环境不一样,不适合长久使用。利用源镜像做修改,配置一些本身不存在的命令环境。
默认文件名就叫Dokerfile 否则还需要加参数 -f 指定文件

  1. ]# vim Dokerfile
  2. FROM hub.c.163.com/library/centos # 源镜像,可以通过docker images 查看
  3. MAINTAINER Meng # 指定创建镜像的用户,自行填写
  4. RUN yum -y install vim # 安装vim命令
  5. RUN yum -y install net-tools # 安装ifconfig命令
  6. CMD /bin/bash
  7. 保存退出
  8. [root@vms10 ~]# docker ps
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. [root@vms10 ~]# docker images
  11. REPOSITORY TAG IMAGE ID CREATED SIZE
  12. nginx latest 605c77e624dd 2 months ago 141MB
  13. hub.c.163.com/library/wordpress latest dccaeccfba36 4 years ago 406MB
  14. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB
  15. hub.c.163.com/library/mysql latest 9e64176cd8a2 4 years ago 407MB
  16. [root@vms10 ~]# cat Dockerfile
  17. FROM hub.c.163.com/library/centos
  18. MAINTAINER Meng
  19. RUN yum -y install vim
  20. RUN yum -y install net-tools
  21. CMD /bin/bash
  22. [root@vms10 ~]# docker build -t centos:v1 . # 指定路径 . 当前路径,默认找Dokerfile
  23. ... ... ... ...
  24. Removing intermediate container 0938679b34ee
  25. ---> 8855d43bd825
  26. Step 5/5 : CMD /bin/bash
  27. ---> Running in 00e5f83fd884
  28. Removing intermediate container 00e5f83fd884
  29. ---> 7d68fa2f7814
  30. Successfully built 7d68fa2f7814
  31. Successfully tagged centos:v1
  32. [root@vms10 ~]# docker images
  33. REPOSITORY TAG IMAGE ID CREATED SIZE
  34. centos v1 7d68fa2f7814 21 seconds ago 559MB
  35. nginx latest 605c77e624dd 2 months ago 141MB
  36. hub.c.163.com/library/wordpress latest dccaeccfba36 4 years ago 406MB
  37. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB
  38. hub.c.163.com/library/mysql latest 9e64176cd8a2 4 years ago 407MB

image.png

  1. [root@vms10 ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. centos v1 7d68fa2f7814 21 seconds ago 559MB
  4. nginx latest 605c77e624dd 2 months ago 141MB
  5. hub.c.163.com/library/wordpress latest dccaeccfba36 4 years ago 406MB
  6. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB
  7. hub.c.163.com/library/mysql latest 9e64176cd8a2 4 years ago 407MB
  8. [root@vms10 ~]# docker run -it --rm --name centos centos:v1
  9. [root@18dece04eeca /]# ifconfig
  10. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  11. inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
  12. ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
  13. RX packets 5 bytes 418 (418.0 B)
  14. RX errors 0 dropped 0 overruns 0 frame 0
  15. TX packets 0 bytes 0 (0.0 B)
  16. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  17. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  18. inet 127.0.0.1 netmask 255.0.0.0
  19. loop txqueuelen 1 (Local Loopback)
  20. RX packets 0 bytes 0 (0.0 B)
  21. RX errors 0 dropped 0 overruns 0 frame 0
  22. TX packets 0 bytes 0 (0.0 B)
  23. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  24. [root@18dece04eeca /]# which vim
  25. /usr/bin/vim

image.png
每多一个 RUN 就会多一层,可以通过history查看。

  1. [root@vms10 ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. centos v1 7d68fa2f7814 12 minutes ago 559MB
  4. nginx latest 605c77e624dd 2 months ago 141MB
  5. hub.c.163.com/library/wordpress latest dccaeccfba36 4 years ago 406MB
  6. hub.c.163.com/library/centos latest 328edcd84f1b 4 years ago 193MB
  7. hub.c.163.com/library/mysql latest 9e64176cd8a2 4 years ago 407MB
  8. [root@vms10 ~]# docker history centos:v1
  9. IMAGE CREATED CREATED BY SIZE COMMENT
  10. 7d68fa2f7814 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
  11. 8855d43bd825 12 minutes ago /bin/sh -c yum -y install net-tools 156MB
  12. 0f677939a1ac 12 minutes ago /bin/sh -c yum -y install vim 211MB
  13. 7e4a9ed3a8e2 13 minutes ago /bin/sh -c #(nop) MAINTAINER Meng 0B
  14. 328edcd84f1b 4 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  15. <missing> 4 years ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
  16. <missing> 4 years ago /bin/sh -c #(nop) ADD file:63492ba809361c51e… 193MB
  17. [root@vms10 ~]# docker history hub.c.163.com/library/centos:latest
  18. IMAGE CREATED CREATED BY SIZE COMMENT
  19. 328edcd84f1b 4 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  20. <missing> 4 years ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
  21. <missing> 4 years ago /bin/sh -c #(nop) ADD file:63492ba809361c51e… 193MB

image.png

上述容器镜像源中默认使用的是CentOS官网的yum源,安装会很慢,将本地yum源复制到 容器中,使用本地yum源安装

  1. [root@vms10 ~]# cd /etc/yum.repos.d/
  2. [root@vms10 yum.repos.d]# ls
  3. CentOS-Base.repo docker-ce.repo epel.repo k8s.repo
  4. [root@vms10 yum.repos.d]# mv CentOS-Base.repo centos-base.repo
  5. [root@vms10 yum.repos.d]# ls
  6. centos-base.repo docker-ce.repo epel.repo k8s.repo
  7. [root@vms10 yum.repos.d]# tar zcf /root/repo.tar.gz *
  8. [root@vms10 yum.repos.d]# cd
  9. [root@vms10 ~]# tar tf repo.tar.gz # 查看压缩包信息
  10. centos-base.repo
  11. docker-ce.repo
  12. epel.repo
  13. k8s.repo
  14. [root@vms10 ~]# vim Dockerfile
  15. FROM hub.c.163.com/library/centos
  16. MAINTAINER Meng
  17. ADD repo.tar.gz /etc/yum.repos.d/
  18. RUN rm -rf /etc/yum.repos.d/CentOS*
  19. RUN yum -y install vim
  20. RUN yum -y install net-tools
  21. CMD /bin/bash
  22. [root@vms10 ~]# docker build -t centos:v1 . # 重新构建

image.png

基于上述镜像创建一个nginx的镜像:

  1. [root@vms10 ~]# vim dockerfile_nginx
  2. FROM centos:v1
  3. MAINTAINER Meng
  4. RUN yum install nginx -y
  5. ADD index.html /usr/share/nginx/html/ # 复制本机文件到容器中的文件
  6. EXPOSE 80 # 通告使用的是 80
  7. CMD ["nginx","-g","daemon off;"]
  8. [root@vms10 ~]# docker build -t nginx:v1 . -f dockerfile_nginx
  9. ... ... ...
  10. Complete!
  11. Removing intermediate container c2d3673bd401
  12. ---> 45c18228331f
  13. Step 5/5 : CMD ["nginx","-g","daemon off;"]
  14. ---> Running in 1b689dbfa7aa
  15. Removing intermediate container 1b689dbfa7aa
  16. ---> ea5f67bdd18b
  17. Successfully built ea5f67bdd18b
  18. Successfully tagged nginx:v1
  19. [root@vms10 ~]# docker images
  20. REPOSITORY TAG IMAGE ID CREATED SIZE
  21. nginx v1 ea5f67bdd18b 29 seconds ago 872MB
  22. centos v1 9fcc8c7162fb 12 minutes ago 643MB
  23. nginx latest 605c77e624dd 2 months ago 141MB
  24. [root@vms10 ~]# docker run -dit --name=nginx -p 80:80 nginx:v1
  25. b8d8314f18157a9e72a0e7868ebe2b29f86bae399f096d5feb9c9639bde2e994
  26. [root@vms10 ~]# curl 127.0.0.1
  27. Hello Nginx !

image.png
image.png

ADD与COPY的区别

  1. [root@vms10 ~]# vim dockerfile_copy-add
  2. FROM centos:v1
  3. MAINTAINER Meng
  4. RUN mkdir /add /copy
  5. ADD repo.tar.gz /add
  6. COPY repo.tar.gz /copy
  7. CMD /bin/bash
  8. [root@vms10 ~]# docker build -t centos:copy-add . -f dockerfile_copy-add
  9. Sending build context to Docker daemon 461.1MB
  10. Step 1/6 : FROM centos:v1
  11. ---> 9fcc8c7162fb
  12. Step 2/6 : MAINTAINER Meng
  13. ---> Using cache
  14. ---> ec789341500e
  15. Step 3/6 : RUN mkdir /add /copy
  16. ---> Running in 2936d14cdd9c
  17. Removing intermediate container 2936d14cdd9c
  18. ---> aa9c5c38dce0
  19. Step 4/6 : ADD repo.tar.gz /add
  20. ---> ea3a78ec452b
  21. Step 5/6 : COPY repo.tar.gz /copy
  22. ---> 4a6f415eb517
  23. Step 6/6 : CMD /bin/bash
  24. ---> Running in 8c275f90d557
  25. Removing intermediate container 8c275f90d557
  26. ---> 192b0d7c6d4a
  27. Successfully built 192b0d7c6d4a
  28. Successfully tagged centos:copy-add

image.png

  1. [root@vms10 ~]# docker run -it --rm centos:copy-add
  2. [root@1ac1b96097a8 /]# ls
  3. add bin dev home lib64 media opt root sbin sys usr
  4. anaconda-post.log copy etc lib lost+found mnt proc run srv tmp var
  5. [root@1ac1b96097a8 /]# ls add/ # ADD会自动解压到目标路径
  6. centos-base.repo docker-ce.repo epel.repo k8s.repo
  7. [root@1ac1b96097a8 /]# ls /copy/ # COPY不会解压,直接复制进入目标
  8. repo.tar.gz
  9. [root@1ac1b96097a8 /]#

image.png

ENV、USER、VOLUME

  1. [root@vms10 ~]# vim dockerfile_other
  2. FROM centos:v1
  3. MAINTAINER Meng
  4. RUN useradd tom # 创建用户
  5. ENV aaa=hahaha # 设置变量
  6. VOLUME ["/data1"] # 创建挂载数据卷 ,相当于手动 -v 参数,自动在容器内创建并且映射挂载到宿主机器中的某个目录,通过docker inspect查看mounts
  7. USER tom
  8. CMD /bin/bash
  9. [root@vms10 ~]# docker build -t centos:other . -f dockerfile_other
  10. ... ... ...
  11. Successfully built d21324796009
  12. Successfully tagged centos:other

启动运行容器查看

  1. [root@vms10 ~]# docker run -it --rm centos:other # 默认没有指定用户进入
  2. [tom@aaf0245e6065 /]$ echo $aaa # 有已经设置好的变量
  3. hahaha
  4. [tom@aaf0245e6065 /]$ ls /data1/ # 有挂载的数据卷
  5. [tom@aaf0245e6065 /]$ exit
  6. [root@vms10 ~]# docker run -it -u root --rm centos:other # 指定用户 -u 进入后就是对应的用户
  7. [root@9c449947d4ef /]# ls
  8. anaconda-post.log data1 etc lib lost+found mnt proc run srv tmp var
  9. bin dev home lib64 media opt root sbin sys usr
  10. [root@9c449947d4ef /]# pwd
  11. /

image.png

练习:

写一个可以ssh的镜像
1、先书写Dockerfile文件

  1. [root@vms10 ~]# vim dockerfile_ssh
  2. FROM centos:v1
  3. MAINTAINER Meng
  4. RUN yum -y install openssh-clients openssh-server
  5. RUN echo 123456 | passwd --stdin root
  6. EXPOSE 22
  7. CMD ["/usr/sbin/sshd","-D"]

2、构建容器

  1. [root@vms10 ~]# docker build -t centos:ssh . -f dockerfile_ssh
  2. ... ... ...
  3. Successfully built 9f88b76650fe
  4. Successfully tagged centos:ssh
  5. [root@vms10 ~]# docker images
  6. REPOSITORY TAG IMAGE ID CREATED SIZE
  7. centos ssh 9f88b76650fe 42 seconds ago 847MB

3、启动容器

  1. [root@vms10 ~]# docker run -dit --restart=always centos:ssh
  2. 后会有报错
  3. [root@vms10 ~]# docker logs 9f5
  4. Could not load host key: /etc/ssh/ssh_host_rsa_key
  5. Could not load host key: /etc/ssh/ssh_host_ecdsa_key
  6. Could not load host key: /etc/ssh/ssh_host_ed25519_key
  7. sshd: no hostkeys available -- exiting.
  8. Could not load host key: /etc/ssh/ssh_host_rsa_key
  9. Could not load host key: /etc/ssh/ssh_host_ecdsa_key
  10. Could not load host key: /etc/ssh/ssh_host_ed25519_key

4、修改Docker文件并建立启动

  1. [root@vms10 ~]# cat dockerfile_ssh
  2. FROM centos:v1
  3. MAINTAINER Meng
  4. RUN yum -y install openssh-clients openssh-server && \
  5. ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key && \
  6. ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \
  7. ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key && \
  8. echo 123456 | passwd --stdin root
  9. EXPOSE 22
  10. CMD ["/usr/sbin/sshd","-D"]
  11. [root@vms10 ~]# docker build -t centos:ssh . -f dockerfile_ssh
  12. ... ... ...
  13. Successfully built 166f8df0c528
  14. Successfully tagged centos:ssh
  15. [root@vms10 ~]# docker run -dit --name=ssh --restart=always centos:ssh
  16. [root@vms10 ~]# docker ps
  17. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  18. efbec4c7bdec centos:ssh "/usr/sbin/sshd -D" 2 seconds ago Up 2 seconds 22/tcp

5、链接测试

  1. [root@vms10 ~]# docker inspect ssh | grep -i ipaddr
  2. "SecondaryIPAddresses": null,
  3. "IPAddress": "172.17.0.3",
  4. "IPAddress": "172.17.0.3",
  5. [root@vms10 ~]# ssh 172.17.0.3
  6. The authenticity of host '172.17.0.3 (172.17.0.3)' can't be established.
  7. ECDSA key fingerprint is SHA256:2iVxe4OfNZBTdjyO8s2Lt8+S3KvrzWzFzA7X0fFwQCk.
  8. ECDSA key fingerprint is MD5:bf:c6:1a:40:1b:48:4f:ce:59:de:07:1e:22:85:e2:c7.
  9. Are you sure you want to continue connecting (yes/no)? yes
  10. Warning: Permanently added '172.17.0.3' (ECDSA) to the list of known hosts.
  11. root@172.17.0.3's password:
  12. [root@efbec4c7bdec ~]# pwd
  13. /root
  14. [root@efbec4c7bdec ~]# exit
  15. logout
  16. Connection to 172.17.0.3 closed.
  17. [root@vms10 ~]#

如果需要映射到宿主机

  1. [root@vms10 ~]# docker run -dit --name=ssh --restart=always -p 22:22 centos:ssh
  2. 启动后使用宿主机端口链接