关于Docker,第一次是在做OCR部署的时候接触,但是项目并没真正使用Docker进行部署。而后也多次在公司其他部门技术分享会上学习,但都没有达到真正的理解,皆是泛泛而过。
近三天,疯狂捣鼓Docker的云化部署的过程中,同时不断与同事的交流下,终于初步理解了Docker这个工具,以下便是自己对近几天所学到的内容作一个总结,方便以后进行查阅。
本文主要记录Docker的基本使用流程和用法,后面会出一篇有关算法Web API项目的Docker部署过程,也算是对今日的一个总结。
Docker 简介
- 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
- 容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
- 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像
建议三个概念充分理解,要不然在下文阅读的过程中容易产生混乱。
Docker 安装
Ubuntu下安装:Install Docker Engine on Ubuntu
CentOS下安装:Install Docker Engine on CentOS
……
本处暂只介绍Ubuntu下Docker的安装,有两种方式(a.使用 APT 安装; b.使用脚本自动安装),请务必看完本节后,再选择使用哪一种方式进行安装。
使用 APT 安装
由于
apt
源使用 HTTPS 以确保软件下载过程中不被篡改。1
2
3
4
5
6
7
8
9# 更新 apt 软件包缓存
sudo apt-get update
# 安装使用 HTTPS 传输时所需的软件包以及 CA 证书
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common为确认所下载软件包的合法性,需要添加软件源的
GPG
密钥。1
2
3
4
5# 中科大源
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 官方源
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -向
sources.list
中添加 Docker 软件源1
2
3
4
5
6
7
8
9
10
11
12# 中科大源
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 官方源
# sudo add-apt-repository \
# "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) \
# stable"
# 以上命令会添加稳定版本的 Docker APT 镜像源,如果需要测试版本的 Docker 请将 stable 改为 test。开始安装
1
2
3
4# 更新 apt 软件包缓存
sudo apt-get update
# 安装 docker-ce
sudo apt-get install docker-ce docker-ce-cli containerd.io
使用脚本自动安装
Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装,另外可以通过
--mirror
选项使用国内源进行安装:1
2curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。
Docker 卸载
旧版本的 Docker 称为 docker
或者 docker-engine
,使用以下命令卸载旧版本:
1 | sudo apt-get remove docker \ |
创建 Docker 镜像
通过已有镜像来新建自有镜像
查找某某镜像是否存在,已ubuntu镜像为例
1
2# 查找ubuntu镜像是否存在,
docker search ubuntu拉取镜像
1
2
3
4
5
6
7
8# 拉取镜像
docker pull ubuntu
# 显示内容如下:
# Using default tag: latest
# latest: Pulling from library/ubuntu
# 08d48e6f1cff: Pull complete
# Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
# Status: Downloaded newer image for ubuntu:latest查看镜像信息
1
2
3
4
5# 查看镜像信息
docker images
# 显示内容如下:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# ubuntu latest 0584b3d2cf6d 9 days ago 196.5 MB启动一个容器
1
2
3
4# 启动一个容器
docker run -it ubuntu:latest /bin/bash
# docker run -it REPOSITORY:TAG /bin/bash 和上面对照
# 回车后命令行形式变了,表示已经进入该容器中这里-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)。
在容器中新安装所需软件
1
2
3
4
5
6
7
8
9
10
11
12# 查看git版本
git --version
# 显示内容如下:
# bash: git: command not found
# 安装git
sudo apt-get install git
# 再次查看git版本
git --version
# 显示内容如下:
# git version 2.25.1退出容器
1
2# 退出容器
eixt使用exit退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。
查看docker中运行的程序(容器)
1
2
3
4
5# 查看所有容器
docker ps -a
# 显示内容如下:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 72f1a8a0e394 ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago将容器转化为一个镜像,即执行commit操作:
1
2
3
4
5
6
7
8# 将容器转化为一个镜像
docker commit -m "ubuntu with git" -a "wangcong" 72f1a8a0e394 wangcong/ubuntu:git
# 查看镜像信息
docker images
# 显示内容如下:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# wangcong/ubuntu git 52166e4475ed 5 seconds ago 358.1 MB
# ubuntu latest 0584b3d2cf6d 9 days ago 196.5 MB其中,-m指定说明信息;-a指定用户信息;72f1a8a0e394代表容器的id;wangcong/ubuntu:git指定目标镜像的用户名、仓库名和 tag 信息。注意这里的用户名wangcong,后边会用到。
停止容器
1
2
3
4
5
6
7
8
9
10
11
12# 查看所有正在运行容器
docker ps
# 显示内容如下:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 72f1a8a0e394 ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago
# 停止单个容器
docker stop 72f1a8a0e394
# docker stop ContainerId
# 停止所有容器
docker stop $(docker ps -aq)删除容器
1
2
3
4
5
6
7
8
9
10
11
12# 查看所有已存在的容器
docker ps -a
# 显示内容如下:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 72f1a8a0e394 ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago
# 删除单个容器
docker rm 72f1a8a0e394
# docker rm ContainerId
# 删除所有容器
docker rm $(docker ps -aq)删除镜像
1
2
3
4
5
6
7
8
9
10# 查看镜像信息
docker images
# 显示内容如下:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# ubuntu latest 0584b3d2cf6d 9 days ago 196.5 MB
# wangcong/ubuntu git 52166e4475ed 5 seconds ago 358.1 MB
# 删除镜像
docker rmi 0584b3d2cf6d
# docker rmi IMAGEID保存镜像
1
2# 保存镜像
docker save -o ubuntu.tar wangcong/ubunt:git加载镜像
1
2# 加载镜像
docker load -i ubuntu.tar后台运行容器
1
docker run -d ubuntu:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
使用了-d参数,使这个容器处于后台运行的状态,不会对当前终端产生任何输出,所有的stdout都输出到log,可以使用
docker logs container_name/container_id
查看。启动、停止、重启容器命令集合:
1
2
3
4
5
6# 启动容器
docker start container_name/container_id
# 停止容器
docker stop container_name/container_id
# 重启容器
docker restart container_name/container_id
通过 Dockerfile 创建镜像
Dockerfile可以理解为一种配置文件,用来告诉docker build命令应该执行哪些操作。一个简易的Dockerfile文件如下所示,官方说明:Dockerfile reference
编写Dockerfile文档
1
2
3
4
5
6
7
8
9
10
11
12# 说明该镜像以哪个镜像为基础
FROM ubuntu:latest
# 构建者的基本信息
MAINTAINER wangcong
# 在build这个镜像时执行的操作
RUN sudo apt-get update
RUN sudo apt-get install git
# 拷贝本地文件到镜像中
COPY ./* /usr/share/gitdir/构建镜像
1
2
3
4# 构建镜像
docker build -t wangcong/ubuntu:gitdir .
# 注意,最后有一个点,表示在本目录下进行构建
# 其中-t用来指定新镜像的用户信息、tag等。查看构建后的镜像
1
2
3
4
5
6
7# 查看构建后的镜像
docker images
# 显示内容如下:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# xianhu/centos gitdir 0749ecbca587 34 minutes ago 359.7 MB
# xianhu/centos git 52166e4475ed About an hour ago 358.1 MB
# centos latest 0584b3d2cf6d 9 days ago 196.5 MB
Docker 加速
使用阿里云镜像加速器
1 | # 编辑守护进程文件 |
内容如下:
1 | { |
注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。
“insecure-registries”:[“10.1.93.164:5000”] 为本地仓库
使之生效:
1 | # 重载 daemon |