1 什么是 Docker
Docker 是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
开发者在本地编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
2 在 Ubuntu 上安装 Docker 引擎
2.1 卸载旧版本的 docker
$ sudo apt-get remove docker docker-engine docker.io containerd runc
2.2 安装
2.2.1 设置存储库
-
更新包索引和安装包以允许通过 HTTPS 使用存储库
$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
-
添加 Docker 的官方 GPG 密钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
通过搜索指纹的最后 8 个字符,验证您现在是否拥有指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的密钥
$ sudo apt-key fingerprint 0EBFCD88 pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ unknown] Docker Release (CE deb) <docker@docker.com> sub rsa4096 2017-02-22 [S]
-
使用以下命令设置稳定存储库
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
2.2.2 安装 docker 引擎
-
更新包索引,安装最新版本的 docker引擎和容器
$ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io
-
要安装特定版本的 docker引擎,请在存储库中列出可用版本,然后选择并安装
#列出可用版本 $ apt-cache madison docker-ce #安装指定的版本 $ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
-
验证docker是否正确安装了 (可以不用去做)
$ sudo docker run hello-world
3 常用的命令
3.1 容器
-
创建容器
# 以交互模式启动一个容器,在容器内执行bash命令。 # -i: 以交互模式运行容器,通常与 -t 同时使用。 $ sudo docker run -it ubuntu:18.04 bash
-
启动停止的容器
$ sudo docker start [容器ID]
-
停止运行的容器
$ sudo docker stop [容器ID]
-
重启容器
$ sudo docker restart [容器ID]
-
进入到容器
# 进入到容器的内部,执行 exit 时退出容器 $ sudo docker attach [容器ID]
-
查看正在运行的容器
$ sudo docker ps
-
查看所有的容器
$ sudo docker ps -a
-
杀死正在运行的容器
$ sudo docker kill [容器ID]
3.2 镜像
-
创建镜像
# 使用当前目录的 Dockerfile 创建镜像,镜像名字和标签为 myimage:mylable # -t: 镜像的名字及标签。 $ sudo docker build -t myimage:mylable .
-
查看镜像
$ sudo docker images
-
删除镜像
-
列出容器
$ sudo docker ps -a
-
移除对应的容器
$ sudo docker rm [容器ID]
-
列出镜像
$ sudo docker images
-
删除镜像
$ sudo docker rmi [镜像ID]
-
4 Dockerfile
4.1 概念
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
4.2 指令
-
FROM:定制的镜像都是基于 FROM 的镜像
-
RUN:用于执行后面跟着的命令行命令
-
WORKDIR:指定工作目录
-
ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
-
开始构建镜像
命令
$ docker build -t [镜像名称]:[镜像标签] .
点代表执行的上下文路径,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
**注意:**上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
Dockerfile 文件所在路径创建 .dockerignore ,里面可以写要忽略的路径和文件(很好用)
5 构建容器的举例
5.1 基础镜像构建容器(以Ubuntu为例)
基础镜像简单,小巧,只有基本功能。版本
5.1.1 拉取 Ubuntu 镜像
$ docker pull ubuntu:18.04
5.1.2 构建容器
-
run.sh
脚本内容#!/bin/sh work_path=$(dirname $(readlink -f $0)) container=$(docker ps -a | grep 'xxx' | grep -oP '\S+' | head -1) #要用新生成的容器ID替换xxx #echo $work_path #echo $container #如果容器不存在就会创建容器 if [ -z "$container" ]; then # --privileged: 扩展权限,可以操作宿机,会有风险. # -i: 交互式操作. # -t: 终端. # -d: 在后台运行容器,并且打印容器id # -v: 挂载目录到容器. # -w: 指定工作目录,运行的时候会直接进入到这个目录下. # --name: 为新建的容器指定名称. # ubuntu:18.04: 容器的基础镜像. # /bin/bash: 交互式 Shell 用的是 /bin/bash. docker run -it -v $work_path:/sdk -w /sdk --name sd_build ubuntu:18.04 /bin/bash else docker start $container docker attach $container # 和 attach 一样,但是退出时不会关闭容器 #docker exec -it $container /bin/bash fi
-
执行脚本
$ sudo ./run.sh
5.2 定制镜像构建容器
这里是以 ubuntu:16.04
为基本新建一个定制的镜像 myimage:mylable
,然后以 myimage:mylable
镜像来构建容器。
5.2.1 文件目录
relax@ubuntu:~/mydocker$ tree -La 2
.
├── Dockerfile # 规则文件
├── .dockerignore # 忽略的文件写在这里面
├── build.sh # 构建镜像的脚本
└── run.sh # 生成,运行容器的脚本
5.2.2 内容
-
Dockerfile
FROM ubuntu:16.04 # Install dependencies RUN apt-get -y update && apt-get install -y --no-install-recommends \ git \ tree # Setup build directory and root user WORKDIR /sdk
-
.dockerignore
写上要忽略的文件 -
build.sh
#!/bin/sh docker build -t myimage:mylable .
-
run.sh
#!/bin/sh work_path=$(dirname $(readlink -f $0)) container=$(docker ps -a | grep '11111' | grep -oP '\S+' | head -1) # 要用新生成的容器ID替换11111。 #echo $work_path #echo $container #如果容器不存在就会创建容器。 if [ -z "$container" ]; then # --privileged: 扩展权限,可以操作宿机,会有风险. # -i: 交互式操作. # -t: 终端. # -d: 在后台运行容器,并且打印容器id # -v: 挂载目录到容器. # -w: 指定工作目录,运行的时候会直接进入到这个目录下. # --name: 为新建的容器指定名称. # myimage:mylable: 容器的基础镜像. # /bin/bash: 交互式 Shell 用的是 /bin/bash. docker run -it -v $work_path:/sdk -w /sdk --name mycontainername myimage:mylable /bin/bash else docker start $container docker attach $container # 和 attach 一样,但是退出时不会关闭容器 #docker exec -it $container /bin/bash fi
5.2.3 执行步骤
-
定制新镜像
$ sudo ./build.sh
-
构建容器
$ sudo ./run.sh
6 其它
6.1 容器里可以安装 OpenSSL
-
下载
# 一般下载完成后会默认启动服务 $ sudo apt-get update $ sudo apt-get install openssh-server
-
其他相关命令
# 查看服务是否启动 $ sudo ps -e | grep ssh # 启动服务 $ sudo /etc/init.d/ssh start # 查看服务状态 $ sudo service ssh status # 关闭服务 $ sudo service ssh stop # 重启服务 $ sudo service ssh restart
6.2 同步时区和时间
$ sudo apt-get update
$ sudo apt install tzdata
# 临时起作用
$ export TZ=Asia/Shanghai
# 永久
# 1.打开文件
vim ~/.bashrc
# 2.末尾加上一下内容
export TZ=Asia/Shanghai
# 3.使能
source ~/.bashrc
6.3 支持中文
6.3.1 查看系统配置
# 查看本地使用的语言环境
root@de4a1a7fc9e6:/sdk# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
# 查看本地支持的语言环境
root@de4a1a7fc9e6:/sdk# locale -a
C
C.UTF-8
POSIX
6.3.2 修改系统配置支持中文(永久生效)
# 修改配置
root@de4a1a7fc9e6:/sdk# vim ~/.bashrc
# 末尾添加上 export LANG=C.UTF-8
# 加载配置
root@de4a1a7fc9e6:/sdk# source ~/.bashrc
# 查看本地使用的语言环境
root@de4a1a7fc9e6:/sdk# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
6.3.3 永久生效,修改 Dockerfile
# 制作镜像的时候加上这一行
ENV LANG C.UTF-8
6.4 本地镜像的导出、导入
当一个新的项目到来时,我们可能需要配置新的开发环境,制作基础镜像。
比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用。
6.4.1 导出镜像
# 查看所有容器
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de4a1a7fc9e6 ubuntu16.04:nt98323 "bash" 14 months ago Exited (0) 8 days ago vigorous_kilby
cde86db6cb11 ubuntu16.04:nt98323 "bash" 15 months ago Exited (0) 7 months ago cool_aryabhata
8b3a2c1fa9ed ubuntu16.04:imx8qxp "bash" 20 months ago Exited (0) 2 months ago gallant_mendeleev
# 导出容器,会在当前目录下生成文件
# docker export [OPTIONS] CONTAINER
$ sudo docker export [de4a1a7fc9e6] > nt98323.tar
6.4.2 导入镜像
# 导入镜像
# docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
$ sudo cat nt98323.tar | docker import - ubuntu16.04:new_nt98323
# 使用下面的命令查看导入的镜像
$ sudo docker images
# 然后可以以此镜像为基础创建容器进行开发