Docker
1. Docker简介
Docker
是一个开源的应用容器引擎,基于Go
语言并遵从Apache2.0
协议开源。Docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到Linux
机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。
Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux
主机。
Docker中的基本概念
- Registry
- 定义:存储和分发Docker镜像的服务,包括官方的Docker Hub、私有的或第三方的Registry。
- 作用:Registry允许用户上传、存储和检索Docker镜像,用户可以通过
docker push
和docker pull
命令与Registry交互。 - 类型:
* 官方Registry(Docker Hub):这是默认的公共Registry,可以在此找到大量的公共镜像。
* 私有Registry:企业或个人可以搭建自己的私有Registry,用于内部使用。
* 第三方Registry:第三方提供的Registry服务,如阿里云Docker Registry、Google Container Registry等。
- Repository
- 定义:Repository是一个命名空间,用于组织和管理一组相关的Docker镜像。每个Registory可以包含多个不同标签(tag)的镜像版本。
- 作用:Repository允许用户针对特定的应用程序或服务组织多个版本的镜像。例如,一个名为nginx的repository可能包含了多个版本的Nginx镜像,如nginx:latest,nginx:1.15.12等。
- 结构:Repository通常以registry/repository的形式表示,例如docker.io/libary/nginx表示Docker Hub上的nginx Repository。
- Image(镜像):Image相当于一个root文件系统,比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
- Container(容器):Container是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
镜像和容器的关系就像面向对象程序设计中类和实例的一样。
Docker的应用场景
- Web应用的自动化打包和发布
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其它的后台应用。
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
Docker的优点
1. 快速、一致地交付应用程序
Docker
允许开发人员使用提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。容器非常适合持续集成和持续交付(CI/CD)工作流程。
2. 响应式部署和扩展
Docker
是基于容器的平台,允许高度可移植的工作负载。Docker容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker
的可移植性和轻量级的特性,还可以轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3. 在同一硬件上运行更多工作负载
Docker
轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案。Docker非常适合于高密度环境以及中小型部署,可以用更少的资源做更多的事情。
2. Docker的架构
Docker为典型的C/S架构模式,使用远程API来进行一系列的操作。
3. Docker镜像加速
- 科大镜像:https://docker.mirrors.ustc.edu.cn/
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 七牛云加速器:https://reg-mirror.qiniu.com
。。。。。。
配置了某个加速器地址后,如果拉取不到镜像,切换另一个重试。可以多配置几个镜像,如果有不能使用的,会自动切换到可以使用的镜像拉取
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
Ubuntu14.04、Debian7Wheezy配置镜像加速
对于使用upstart的系统而言,编辑/etc/default/docker文件,在其中的DOCKER_OPTS中配置加速器地址:
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
重新启动服务:
sudo service docker restart
Ubuntu16.04+、Debian8+、CentOS7
对于使用systemd的系统,在/etc/docker/daemon.json中写入如下内容(如果文件不存在新建即可)
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker
检查加速器是否生效
docker info 输出如下信息说明配置成功:
Registry Mirrors:
https://reg-mirror.qiniu.com
4. 使用Docker
Docker Hello World
使用docker run
命令启动一个容器。
docker run ubuntu:15.10 /bin/echo 'hello world'
指令解释:以ubuntu:15.10镜像创建一个新容器,然后在容器中执行/bin/echo 'hello world'。如果不指定镜像的tag,docker将会使用标签为latest的镜像
以交互式的方式启动容器
docker run -i -t ubuntu:15.10 /bin/bash
参数说明:
- -i:使容器的标准输入保持打开,允许与容器进行交互
- -t:在新容器内指定一个伪终端或终端
- /bin/bash:指定启动容器时要运行的命令。/bin/bash即启动一个Bash shell
执行这条命令docker会做以下几件事情:
1.拉取镜像:如果本地没有Ubuntu 15.10的镜像,Docker会从Docker Hub下载这个镜像
2.启动镜像:使用指定的镜像启动一个新的容器
3.进入Bash shell:在容器内启动一个交互式的Bash shell
可以使用exit
或CTRL + D
来退出容器
以后台模式启动容器
docker run -d ubuntu:15.10 /bin/sh -c 'while true; do echo hello world; sleep 1; done'
指令解释:启动一个后台运行的Ubuntu 15.10容器,并在容器内执行一个循环命令,每隔一秒输出一次'hello world'
参数解释
- -d:在后台运行容器,不会阻塞当前终端
- /bin/sh -c:-c表示后面跟着的字符串将作为命令执行
网络端口映射
-
-P:容器内部端口随机映射到主机的端口
-
docker run ubuntu:15.10 -P /bin/echo 'hello world'
-
-
-p:容器内部端口映射到指定的主机端口
-
docker run ubuntu:15.10 -p 主机端口:容器端口 /bin/echo 'hello world'
1. 指定容器绑定的网络地址,比如绑定127.0.0.1 docker run ubuntu:15.10 -p 127.0.0.1:5001:5000 /bin/echo 'hello world' 2. 在不指定通信协议的情况下,默认是tcp协议。如果需要指定为UDP协议,在端口后面加上/udp docker run ubuntu:15.10 -p 127.0.0.1:5001:5000/udp /bin/echo 'hello world' 3. 查看指定容器的端口映射 docker port containerId/containerName portInContainer 4. 列出所有容器及其端口映射 docker ps --format '{{.Names}} {{.Ports}}'
-
Docker容器互联
端口映射并不是唯一把docker连接到另一个容器的方法。docker有一个连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker会自动对它进行命名。可以通过--name
标识来命名容器。
docker run -P --name test-name ubuntu:15.10 /bin/echo 'hello world'
新建网络
docker network create -d bridge test-net
-d:指定Docker网络类型,有bridge、overlay等。
bridge: 默认的Docker网络类型,它为每个容器提供了一个虚拟网桥,使容器能够通过ip地址相互通信。
overlay:用于创建跨主机的网络,允许容器在不同的Docker宿主机之间通信,通常用于Docker Swarm模式或Kubernetes等集群环境中。
连接容器
运行一个容器指定名为test1连接到新建的test-net网络
docker run -itd --name test1 --network test-net ubuntu /bin/bash
运行第二个容器指定名为test2连接到新建的test-net网络
docker run -itd --name test2 --network test-net ubuntu /bin/bash
通过ping指令来查看test1容器和test2容器之间建立了互联
docker exec -it test1 /bin/bash
ping test2
如果有多个容器之间需要互相连接,推荐使用Docker Compose
5. Docker仓库管理
仓库(Repository)是集中存放镜像的地方。以下介绍一下Docker Hub。其它的镜像仓库与Docker Hub的不同之处是远程的服务商不一样,操作都是一样的。
注册
在Docker Hub免费注册一个Docker账号
登录和退出
- 登录
docker login
输入用户名和密码,登录成功后,可以从Docker Hub上拉取自己账号下的全部镜像
- 退出
docker logout
推送镜像
- 使用
docker push
命令推送镜像到Docker Hub
6. Docker Compose
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。
Compose使用的三个步骤:
- 使用Dockerfile定义应用程序的环境
- 使用docker-compose.yml定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
- 最后,执行docker-compose up命令来启动并运行整个应用程序
docker-compose.yml的配置案例如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose安装
Linux上可以从Github上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。运行以下命令以下载Docker Compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其它版本的Compose,替换v2.2.2
Docker Compose存放在github,不太稳定,可以通过执行下面的命令,高速安装Docker Compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
7. Dockerfile
什么是Dockerfile
Dockerfile是一个文本文件,包含了构建Docker镜像的所有指令。
Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
通过定义一系列命令和参数,Dockerfile指导Docker构建一个自定义的镜像。
使用Dockerfile定制镜像
1. 以定制一个nginx镜像为例(构建好的镜像内会有一个/usr/share/nginx/html/index.html文件)
vi Dockerfile
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FROM和RUN指令的作用
FROM:定制的镜像所依赖的基础镜像,这里的nginx就是基础镜像
RUN:用于执行后面跟着的命令行命令。有以下两种格式:
-
- shell格式
RUN <命令行命令>
<命令行命令>等同于在终端操作的shell命令
-
- exec格式
RUN [‘可执行文件’, ‘参数1’, ‘参数2’]
例如:RUN[‘./test.php’, ‘dev’, ‘offline’] 等价于 RUN ./test.php dev offline
注意:Dockerfile的每一条指令都会在docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
上述的指令执行完成后会创建四层镜像。将指令进行调整
FROM centos
RUN yum -y install wget \
&& RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& RUN tar -xvf redis.tar.gz
上述指令执行完成后只会创建两层镜像
8. Docker Machine
last. Docker常用指令
1. 显示容器的全部信息
docker ps -a --no-trunc
CONTAINER_ID:容器ID
IMAGE:使用的镜像
COMMAND:启动容器时运行的命令
CREATED:容器的创建时间
STATUS:容器的状态
容器的状态分为以下几种
- created 已创建
- restarting 重启中
- running或Up 运行中
- removing 迁移中
- paused 暂停
- exited 停止
- dead 死亡
PORTS:容器的端口信息和使用的连接类型(tcp/udp)
NAMES:自动分配的容器名称
2. 查看某个容器的详细信息
docker inspect containerId
3. 以终端的方式进入容器
docker attach containerId
注:如果从容器退出,会导致容器停止
docker exec -it containerId /bin/bash
4. 查看容器内的标准输出
docker logs containerName/containerId
5. 停止容器
docker stop containerName/containerId
6. 查看docker客户端的所有命令选项
docker
7. 查看具体的docker命令的使用方法
docker command --help
8. 启动容器时指定容器的名称
docker run -itd --name ubuntu-test ubuntu /bin/bash
通过--name指定容器的名称
9. 启动已停止的容器
docker start containerId
10. 获取镜像
docker pull imageName
11. 停止一个容器
docker stop containerId
12. 列出镜像
docker images
输出信息说明:
* REPOSITORY:镜像的仓库源
* TAG:镜像的标签
* IMAGE ID:镜像ID
* CREATED:镜像的创建时间
* SIZE:镜像的大小
13. 查找镜像
可以从[Docker Hub](https://hub.docker.com/)
网站来搜索镜像,也可以使用docker search
命令来搜索镜像。
docker search imageName
输出信息解释
- NAME:镜像的名称
- DESCRIPTION:镜像的描述
- OFFICIAL:是否docker官方发布
- STARS:类似Github里面的star
- AUTOMATED:自动构建
在Docker中,自动构建镜像指的是使用脚本或工具自动构建Docker镜像的过程,这一过程通常是在CI/CD(持续集成/持续部署)流程中实现的。
自动构建镜像的方式
- 使用
Dockerfile
:
- 定义:
Dockerfile
是一个文本文件,其中包含了构建镜像所需的一系列指令。- 构建:通过运行
docker build
命令并指定Dockerfile
的位置,Docker会根据Dockerfile
中的指令逐步构建镜像。
- 使用CI/CD工具:
- 定义:CI/CD工具(如Jenkins, GitHub Actions, GitLab CI/CD, CircleCI等)可以在代码提交到仓库后自动触发构建流程。
- 构建:这些工具可以根据预定义的配置文件(如.gitlab-ci.yml, Jenkinsfile, github/workflows/*.yml等)自动构建Docker镜像,并将其推送到Docker注册表中。
.gitlab-ci.yml的相关内容参考
自动构建镜像的好处
- 可重复性:每次构建都使用相同的指令,保证了镜像的一致性。
- 自动化:减少了手动构建镜像的需要,节省了时间和精力。
- 版本控制:
Dockerfile
可以被纳入版本控制系统,方便跟踪和回滚更改。- 易于集成:可以轻松地与其他CI/CD工具集成,实现自动化部署。
- 标准化:有助于实现标准化的开发和部署流程。
14. 删除镜像
docker rmi imageRepository:tag
15. 创建镜像
15.1 当从docker镜像仓库拉取的镜像无法满足我们的需求时
可以通过以下两种方式对镜像进行更改
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用
Dockerfile
指令来创建一个新的镜像
15.1.1 更新镜像
(1)进入容器,更新系统包
apt-get update
apt-get upgrade -y
(2)使用exit
命令退出容器
(3)通过命令docker commit
来提交容器副本
docker commit -m ='' -a='' containerId 要创建的镜像名(无需引号)[如docker-test/ubuntu:version10000]
- -m:提交的描述信息
- -a:指定镜像作者
通过docker images
可以看到本地镜像仓库中多了docker-test/ubuntu:version10000
15.1.2 构建镜像
使用命令docker build
从零开始创建一个新的镜像。需要创建一个Dockerfile
文件,其中包含一组指令告诉Docker如何构建镜像。
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
内容解释
- FROM centos:6.7
- 基础镜像:使用 centos:6.7 作为基础镜像。
- MAINTAINER Fisher “fisher@sudops.com”
- 维护者信息:指定 Docker 镜像的维护者信息。
- RUN /bin/echo ‘root:123456’ | chpasswd
- 设置 root 用户密码:使用 chpasswd 命令设置 root 用户的密码为 123456。
- RUN useradd runoob
- 添加用户:创建一个名为 runoob 的新用户。
- RUN /bin/echo ‘runoob:123456’ | chpasswd
- 设置 runoob 用户密码:使用 chpasswd 命令设置 runoob 用户的密码为 123456。
- RUN /bin/echo -e "LANG=“en_US.UTF-8"” >/etc/default/local
- 设置语言环境:设置系统的默认语言环境为 en_US.UTF-8。
- EXPOSE 22
- 暴露端口:声明容器将监听 SSH 服务的默认端口 22。
- EXPOSE 80
- 暴露端口:声明容器将监听 HTTP 服务的默认端口 80。
- CMD /usr/sbin/sshd -D
- 启动命令:定义容器启动时执行的命令。这里启动 sshd 服务并使其在后台运行。
每一条指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写
docker build -t 要创建的目标镜像名 Dockerfile文件位置(如果为. 则表示使用当前目录下的Dockerfile)
16. 设置镜像标签
docker tag imageId userName/repository:tag