Docker 101 - Dockerfile

docker

Dockerfile

一个开启Docker SSH的Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#sshd
#
# VERSION 1.0.0
FROM docker.cn/docker/ubuntu:14.04
MAINTAINER Lanvige Jiang <lanvige(@)gmail.com>
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:password01' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

指令

- ADD

格式为 ADD

该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

- CMD

指令,来指定运行容器时的操作命令。

- ENV

你可以通过-e参数给容器设置一些环境变量,用来覆盖Dockerfile中ENV的设置。

- RUN

格式为 RUN 或 RUN [“executable”, “param1”, “param2”]。

前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”, “echo hello”]。

每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。

- EXPOSE

格式为 EXPOSE […]。

EXPOSE 指令指定在 docker 允许时指定的端口进行转发,是不是不指定的端口就不能转发了呢?

告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。

EXPOSE 指令可以使通过一个端口连接到容器内部,在容器内部的端口号不需要和暴露在容器外面的端口号一致。

- WORKDIR

设置一个工作目录,默认是根目录/

  • VOLUME
    共享用

Build the image:

1
2
3
4
$ sudo docker build -t <TAG> .
# TAG 用户名/tag
# sudo docker build -t="lanvige/ruby_2.1.5" .

使用该Image运行一个 container

运行这个Image,并给container起名叫test_sshd。然后映射docker的22端口到本机。

1
2
3
$ sudo docker run -d -P --name <NAME> <TAG>
$ sudo docker port <NAME> 22
0.0.0.0:49154

And now you can ssh as root on the container’s IP address (you can find it with docker inspect) or on port 49154 of the Docker daemon’s host IP address (ip address or ifconfig can tell you that) or localhost if on the Docker daemon host:

现在,就可以用root账号和Host IP(Host 中可直接使用localhost) + 映射返回的端口号,ssh到contrainer中。

1
2
3
$ ssh root@10.0.0.2 -p 49154
# The password is ``password01``.
$$

替换中国源

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse

替换源:

1
RUN echo "deb http://mirrors.sohu.com/ubuntu trusty main restricted universe multiverse" > /etc/apt/sources.list

Q: 如何替换多行源?

Image Export & Import

如果是要将一个contrainer 导出,需要使用 docker export

1
2
$ sudo docker ps -a
$ sudo docker export <CONTAINER ID> > /tmp/image.tar
1
2
$ sudo docker images
$ sudo docker save <Image Name> > /tmp/image.tar

Import

将image.tar文件复制到另一台装有docker的机器上后,运行 docker load,就可以看到该image了。

1
2
$ docker load < /tmp/image.tar
$ sudo docker images

REF::