Contents

Docker的基本使用

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
之前安装tensorflow时尝试了在docker下安装,程序运行在一个独立的环境里,感觉上相当于一个虚拟机。这篇博客记录了使用docker打包程序以及下载到主机上运行的全过程,

1.Docker安装以及卸载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 确保 yum 包更新到最新。
sudo yum update
# 执行 Docker 安装脚本。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 启动 Docker 进程。
sudo systemctl start docker
# 验证 docker 是否安装成功并在容器中执行一个测试的镜像。
sudo docker run hello-world
docker ps
# 非root使用(先登出当前帐号)
sudo usermod -aG docker your-user
# 卸载 Docker 软件包:
sudo yum remove docker-ce
# 主机上的镜像、容器、存储卷、或定制配置文件不会自动删除。如需删除所有镜像、容器和存储卷,请运行下列命令:
sudo rm -rf /var/lib/docker

2. Dockerfile 指令详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim
# 将工作目录设置为 /app
WORKDIR /app
# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app
# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt
# 使端口 80 可供此容器外的环境使用
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行 app.py
CMD ["python", "app.py"]

2.1. FROM 指定基础镜像

格式为 FROM <image> 或 FROM <image>:<tag> 。
第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM指令(每个镜像一次)。

2.2. MAINTAINER

格式为 MAINTAINER <name> ,指定维护者信息。

2.3. RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  1. shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  1. exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。

2.4 COPY 复制文件

格式:

  • COPY [–chown=:] <源路径>… <目标路径>
  • COPY [–chown=:] ["<源路径1>",… “<目标路径>”]
    和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

COPY package.json /usr/src/app/ 

2.5 ADD 更高级的复制文件

格式为 ADD <src> <dest> 。

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

2.6 CMD 容器启动命令

支持三种格式

  • CMD [“executable”,”param1″,”param2″] 使用 exec 执行,推荐方式;
  • CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
  • CMD [“param1″,”param2”] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

2.7 WORKDIR 指定工作目录

格式为 WORKDIR /path/to/workdir 。

为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

2.8 EXPOSE

格式为 EXPOSE <port> [<port>…] 。

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

2.9 USER

格式为 USER daemon 。

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

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。

3. Docker镜像构建上传

3.1 构建镜像

以下命令基于Dockerfile所在文件夹

1
2
3
4
5
6
# 创建 Docker 镜像,我们将使用 -t 对其进行标记,以使其具有友好名称
docker build -t friendlyhello .
# 运行应用,使用 -p 参数将机器的 4000 端口映射到容器暴露的 80 端口:
docker run -p 4000:80 friendlyhello
# 从后台在分离模式下运行应用。
docker run -d -p 4000:80 friendlyhello

3.2 使用 Docker ID 登录

如果您没有 Docker 帐户,请在 cloud.docker.com 中进行注册。记录您的用户名。

登录本地机器上的 Docker 公用镜像库。

1
docker login

3.3 上传镜像

1
2
3
4
# 标记镜像
docker tag friendlyhello john/get-started:part1
# 将已标记的镜像上传到镜像仓库:
docker push username/repository:tag

push成功

4. Docker镜像使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 列出镜像列表
docker images 
# 查找镜像
docker search httpd
# 拖取镜像
docker pull httpd
# 更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -t -i univeroner/weiborobot /bin/bash
# 在完成操作之后,输入 exit命令来退出这个容器。
# 通过命令 docker commit来提交容器副本
sudo docker commit -m "20190309" 900be23de368 univeroner/weiborobot:latest
# 删除本地镜像(<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要)
docker image rm [选项] <镜像1> [<镜像2> ...]

tips:删除none镜像

1
2
3
4
5
6
# 停止docker
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')
# 删除docker
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')
# 删除images
docker rmi $(docker images | grep "none" | awk '{print $3}')

参考

  1. Docker 从入门到实践 https://wsgzao.github.io/post/docker/
  2. Docker 教程 http://www.runoob.com/docker/docker-tutorial.html
  3. Get Docker CE for CentOS https://docs.docker.com/install/linux/docker-ce/centos/
  4. Docker —— 从入门到实践 https://legacy.gitbook.com/book/yeasy/docker_practice/details