Docker是一个开源的应用容器引擎,让开发者可以打包她们的应用以及依赖包到一个可移植的容器中,之后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙箱机制,互相之间不会有任何插口。

Docker安装
Docker支持多种平台,包括Ubuntu、Debian、CentOS等Linux发行版,以及Windows和macOS。
Linux上安装Docker
以Ubuntu为例,首先更新应用包索引:
sudo apt-get update
之后安装Docker:
sudo apt-get install docker-ce docker-ce-cli containerd.io
Windows上安装Docker
在Windows上,可以通过安装DockerDesktop来使用Docker。访问Docker官网下载DockerDesktop安装程序,之后根据向导完成安装。
https://www.docker.com/products/docker-desktop/
macOS上安装Docker
在macOS上,同样可以通过安装DockerDesktop来使用Docker。访问Docker官网下载DockerDesktop安装程序,之后根据向导完成安装。

验证安装
安装完成后,可以通过运行hello-world镜像来验证Docker是否正确安装:
docker run hello-world
假如安装正确,你将见到一条消息,说明你的Docker正在运行,而且还能从DockerHub拉取镜像。
或则使用dockerversion命令看下docker版本,能看见版本说明也是安装成功:

Docker镜像管理
Docker镜像是一个轻量级、可执行的独立软件包,包含运行应用所需的所有内容:代码、运行时、库、环境变量和配置文件。
查找镜像
在DockerHub上查找镜像:
docker search ubuntu
这个命令会列举DockerHub中与ubuntu相关的镜像。

拉取镜像
从DockerHub拉取一个镜像到本地:
docker pull ubuntu:18.04
这个命令会从DockerHub拉取Ubuntu18.04的官方镜像。
查看本地镜像
查看当前系统上的Docker镜像列表:
docker images
截图中是我之前拉的SRS镜像。
删掉镜像
删掉一个本地镜像:
docker rmi ubuntu:18.04
这个命令会删掉本地的Ubuntu18.04镜像。
建立镜像
使用Dockerfile构建新的镜像:
docker build -t my-ubuntu .
这个命令会按照当前目录下的Dockerfile来建立一个名为my-ubuntu的镜像。
Docker容器管理
容器是独立运行的一个或一组应用,以及它们的运行环境。通过Docker容器,开发者可以打包应用与环境,并在任何支持Docker的平台上无缝布署。
运行容器
从镜像启动一个新容器:

docker run -it --name my-container ubuntu:18.04 /bin/bash
这个命令会从ubuntu:18.04镜像启动一个名为my-container的容器,并启动一个交互式的bash会话。
查看运行中的容器
查看当前正在运行的容器:
docker ps
停止容器
停止一个运行中的容器:
docker stop my-container
启动已停止的容器
启动一个已停止的容器:
docker start my-container
删掉容器
删掉一个容器:
docker rm my-container
注意:只有停止状态的容器能够被删掉。
容器日志
查看容器的输出日志:
docker logs my-container
这个命令会显示容器的标准输出。
Docker网路管理
Docker网路容许容器间通讯,以及容器与外部世界通讯。Docker提供了多种网路模式,包括bridge、host、none和overlay等。
查看网路
列举所有Docker网路:
docker network ls

创建网路
创建一个新的网路:
docker network create --driver bridge my-bridge-network
这个命令创建了一个名为my-bridge-network的bridge网路。
运行容器时指定网路
在特定网路中运行容器:
docker run -d --name my-container --network my-bridge-network nginx
这个命令在my-bridge-network网路中启动了一个名为my-container的容器,并运行nginx服务。
联接容器到网路
将已存在的容器联接到网路:
docker network connect my-bridge-network my-container
断掉容器与网路的联接
从网路中断掉容器:
docker network disconnect my-bridge-network my-container
删掉网路
删掉一个网路:
docker network rm my-bridge-network
Docker卷和数据管理
Docker卷用于持久化和共享容器的数据。通过使用卷,可以将数据生命周期从容器生命周期中前馈下来。
创建卷
创建一个新的卷:
docker volume create my-volume
运行容器时挂载卷
在容器中使用卷:
docker run -d --name my-container -v my-volume:/data nginx
这个命令启动了一个nginx容器,将my-volume卷挂载到容器的/data目录。
查看卷
列举所有卷:
docker volume ls

删掉卷
删掉一个卷:
docker volume rm my-volume
DockerCompose使用
DockerCompose是一个用于定义和运行多容器Docker应用的工具。通过Compose,你可以使用YAML文件来配置应用的服务。
安装DockerCompose
请依照官方文档指引安装DockerCompose。
使用Compose文件定义服务
创建一个docker-compose.yml文件,定义服务:
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
启动服务
通过DockerCompose启动服务:
docker-compose up
停止服务
停止由DockerCompose启动的服务:
docker-compose down
制做Dockerfile
制做一个Dockerfile一般涉及定义从那个基础镜像开始、如何建立你的应用、以及当容器启动时须要执行哪些命令等步骤。下边是一个简单的示例,展示了怎样为一个PythonFlask应用创建一个Dockerfile。
示例:PythonFlask应用
假定你有一个简单的Flask应用,结构如下:
/your-app
- app.py
- requirements.txt
其中,app.py是Flask应用的主文件,requirements.txt列举了所有的Python依赖。
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
requirements.txt
flask
Dockerfile
接出来,创建一个Dockerfile来容器化这个Flask应用。
# 使用官方Python运行时作为父镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 将当前目录内容复制到位于/app中的容器中
COPY . /app
# 安装requirements.txt中指定的任何所需包
RUN pip install --no-cache-dir -r requirements.txt
# 使端口80可用于该容器外的环境
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行app.py
CMD ["python", "app.py"]
这个Dockerfile执行了以下步骤:
从官方Python3.8slim镜像开始打造。将工作目录设置为容器内的/app。复制当前目录下的所有文件到容器内的/app目录。使用pip安装requirements.txt文件中列举的所有依赖。将容器的端口80设置为对外开放。设置一个环境变量NAME,值为World。定义容器启动时执行的默认命令为pythonapp.py。建立和运行Docker镜像
在包含Dockerfile的目录中运行以下命令来建立镜像:
docker build -t my-flask-app .
打造完成后,运行你的容器:
docker run -p 4000:80 my-flask-app
这会将容器的80端口映射到宿主机的4000端口。如今,你可以通过访问:4000来访问你的Flask应用。
这只是一个基本的Dockerfile示例。按照你的应用需求,你可能须要调整和优化你的Dockerfile,比如使用多阶段建立来减少镜像大小,或则添加更多的配置和优化步骤。
制做javajar文件Dockerfile
制做一个用于Java应用(打包成jar文件)的Dockerfile一般须要考虑基础镜像、构建环境、运行环境和启动命令等诱因。以下是一个示例,展示怎样为一个简单的SpringBoot应用创建一个Dockerfile。
假定Dockerfile
# 使用官方OpenJDK运行时作为父镜像
FROM openjdk:11-jre-slim
# 设置工作目录为/app
WORKDIR /app
# 将jar文件复制到容器的/app目录下
COPY target/app.jar /app/app.jar
# 暴露应用运行的端口
EXPOSE 8080
# 定义容器启动时执行的命令
CMD ["java", "-jar", "/app/app.jar"]
这个Dockerfile执行了以下步骤:

基础镜像:从官方OpenJDK11slim版本的镜像开始打造。这个镜像包含了运行Java应用所需的JRE环境。工作目录:将容器内的工作目录设置为/app。复制jar文件:将建立好的jar文件(假定坐落你的项目的target目录下)复制到容器的/app目录下。请按照你的实际建立路径更改COPY命令中的源路径。曝露端口:将容器的端口8080设置为对外开放,这假定你的SpringBoot应用默认窃听在8080端口上。假如你的应用窃听的是其他端口,请相应地更改此处。启动命令:定义了容器启动时执行的命令,使用java-jar来运行jar文件。建立和运行Docker镜像
在包含Dockerfile的目录中运行以下命令来建立镜像:
docker build -t my-spring-boot-app .
打造完成后,运行你的容器:
docker run -p 8080:8080 my-spring-boot-app
这会将容器的8080端口映射到宿主机的8080端口。如今,你可以通过访问:8080来访问你的SpringBoot应用。
请注意,这个示例假定你的SpringBoot应用已然被建立并打包成jar文件。在实际的项目中,你可能会使用Maven或Gradle作为重构工具,而且可能会在Dockerfile中包含建立步骤,或则使用多阶段建立来优化最终镜像的大小。
DockerSwarm集群管理
DockerSwarm是Docker的原生集群管理工具,它容许你将多个Docker主机组成一个集群,在集群中布署和管理容器。
Swarm集群
在主节点上初始化Swarm集群:
docker swarm init --advertise-addr
这个命令会初始化一个Swarm集群,并将当前节点设置为管理节点。
Swarm集群
在工作节点上加入Swarm集群:
docker swarm join --token :2377
使用管理节点提供的加入令牌来加入集群。
Swarm节点
在管理节点上查看集群的节点信息:
docker node ls
布署服务到Swarm
在Swarm集群中布署服务:
docker service create --replicas 3 --name my-web nginx
这个命令会在Swarm集群中创建一个名为my-web的服务,并布署3个nginx容器实例。
Swarm服务
列举所有Swarm服务:
docker service ls
查看特定服务的详尽信息:
docker service ps my-web
缩放服务的副本数目:
docker service scale my-web=5
更新服务:
docker service update --image nginx:latest my-web
安全管理
Docker安全包括镜像安全、容器运行时安全、网络安全等方面。
官方镜像
尽可能使用官方镜像,降低安全风险。
扫描镜像中的漏洞
使用DockerHub或其他第三方工具扫描镜像中的安全漏洞。
最小化容器权限
使用最小权限原则运行容器,比如,防止使用--privileged标志。
管理容器的网路访问
按照须要配置容器的网路访问策略,防止毋须要的外部访问。
安全储存敏感数据
使用Dockersecrets或其他加密工具安全地储存和管理敏感数据。
Docker性能优化
优化Docker的性能,包括容器性能优化、资源分配、日志管理等。
优化容器启动时间
尽量减低容器镜像的大小深度linux系统,使用AlpineLinux等轻量级基础镜像。
资源限制
合理分配容器的CPU和显存资源docker dionaea,防止资源争抢造成的性能增长。
docker run -d --name my-container --memory=512m --cpus=1 nginx
日志管理
合理配置容器日志的大小和滚动策略,防止日志文件过大影响性能。
Docker文件系统和储存优化Overlay2文件系统
Overlay2是Docker推荐的储存驱动docker dionaea,由于它提供了良好的性能和兼容性。Overlay2通过创建一个层叠的文件系统,将容器和镜像的变更层置于顶楼,而共享的只读层保持不变。
多阶段建立
借助Dockerfile的多阶段建立可以降低最终镜像的大小,提升建立效率。诸如,您可以在一个阶段中编译您的应用,之后在另一个阶段中仅复制编译后的二补码文件到一个新的轻量级基础镜像中。
# 第一阶段:编译
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 第二阶段:运行
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Docker安全加固使用非root用户运行容器
默认情况下,容器以root用户运行,这可能带来潜在的安全风险。通过在Dockerfile手指定非root用户,可以降低容器的安全性。
FROM nginx
RUN adduser -D myuser
USER myuser
借助Docker秘密管理敏感信息
对于须要在容器中使用的敏感信息(如数据库密码),应防止直接在Dockerfile或环境变量中硬编码美国linux主机,而是使用Docker秘密(DockerSecrets)来安全地管理这种数据。
Docker监控和日志管理使用Prometheus和Grafana进行监控
Prometheus是一个开源监控解决方案,可以与Docker容器化环境挺好地集成。通过导入容器和Docker守护进程的测度标准,Prometheus可以搜集并储存那些数据,而Grafana可以拿来可视化这种数据。
配置日志驱动
Docker支持多种日志驱动程序,可以将容器的日志发送到不同的目的地,如本地文件、json-file或远程日志服务器。通过合理配置日志驱动,可以有效管理容器日志。
docker run -d --name my-container --log-driver=syslog --log-opt syslog-address=udp://192.168.0.42:514 nginx
DockerCI/CD集成
Docker可以与Jenkins、GitLabCI/CD等持续集成和持续布署工具无缝集成。通过在CI/CD管线中使用Docker,可以手动化建立、测试和布署容器化应用。
示例:使用Docker在GitLabCI/CD中建立和推送镜像
build_image:
stage: build
script:
- docker build -t myapp:$CI_COMMIT_SHA .
- docker push myapp:$CI_COMMIT_SHA
Docker常见问题解答
Q:怎样删掉所有停止的容器?
A:使用dockercontainerprune命令。
Q:怎样删掉悬空(dangling)镜像?
A:使用dockerimageprune命令。
Q:Docker容器与虚拟机有何不同?
A:Docker容器是轻量级的,共享宿主机的内核,而虚拟机包括完整的操作系统和虚拟硬件,因而更重。
Q:怎样备份Docker容器中的数据?
A:可以通过创建数据卷的快照来备份数据,或则使用dockercp命令将数据从容器复制到宿主机。
