Docker
1. 简介
Docker 是一个开源的应用容器引擎,它可以让开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的优势:
更高效的利用系统资源
由于容器不需要运行完整的操作系统,相较于传统的虚拟机,它们对系统资源的需求更少,能够更高效地利用服务器的 CPU、内存和存储。
例如,在一台服务器上可以运行数百个 Docker 容器,而传统虚拟机可能只能运行十几个。
更快的部署和启动时间
Docker 容器的启动时间通常在秒级,而虚拟机的启动可能需要几分钟。
这使得应用能够更快地响应需求,特别是在需要快速扩展或缩容的场景中。
一致性的运行环境
开发者可以在本地构建和测试 Docker 容器,然后确保在生产环境中运行的是完全相同的环境,减少了由于环境差异导致的问题。
例如,一个基于 Python 开发的应用,在开发环境中使用特定版本的 Python 和相关库,通过 Docker 可以确保在生产环境中也使用相同的配置。
易于迁移和扩展
Docker 容器可以轻松地在不同的服务器之间迁移,无论是在本地数据中心还是在云平台上。
同时,通过简单地增加或减少运行的容器数量,可以轻松地实现应用的横向扩展。
版本控制和回滚
每个 Docker 镜像都可以进行版本控制,当出现问题时,可以快速回滚到之前的版本。
这类似于代码的版本控制,为应用的维护和更新提供了极大的便利。
2. 核心概念
镜像(Image)
镜像是 Docker 容器的只读模板,包含了运行应用所需的所有内容,如代码、运行时环境、库和依赖等。
可以将镜像看作是一个类,而容器则是基于这个类创建的实例。
镜像可以从 Docker Hub 等公共仓库获取,也可以自己创建和定制。
例如,一个 Python 应用的镜像可能包含 Python 解释器、相关库以及应用代码。
容器(Container)
容器是基于镜像创建的运行实例,它是一个独立、隔离的运行环境,可以启动、停止、删除等。
多个容器可以基于同一个镜像创建,并且每个容器的运行状态相互独立。
容器在运行时会在其内部产生一些数据,如日志、进程 ID 等。
仓库(Repository)
仓库用于存储和管理 Docker 镜像,可以是公共的,如 Docker Hub,也可以是私有的。
开发者可以将自己创建的镜像推送到仓库中,以便在不同的环境中使用。
例如,一个公司可以创建自己的私有仓库来存储内部使用的镜像。
3. 安装
# 1.下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
# 2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3.安装Docker
yum makecache fast
yum -y install docker-ce
# 4.启动Docker,并设置为开机自动启动,测试
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world
4. 配置镜像源
常见国内镜像源:
- 中国官方镜像:
https://registry.docker-cn.com
- 网易163镜像:
http://hub-mirror.c.163.com
- 中科大镜像:
https://docker.mirrors.ustc.edu.cn
- 阿里云镜像:
https://[xxx].mirror.aliyuncs.com
- 腾讯云镜像:
https://mirror.ccs.tencentyun.com
- 打开配置文件
sudo vim /etc/docker/daemon.json
- 配置镜像源
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
// 你可以继续添加其他镜像源地址....
]
}
ps:使用云服务时最好使用相同厂商的镜像源
5. 基本命令
docker pull
用于从 Docker 仓库拉取指定的镜像。
语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
示例:
docker pull ubuntu:latest # 拉取最新的 Ubuntu 镜像
docker run
基于指定的镜像创建并启动一个新的容器。
语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用选项:
-d
:以守护式(后台)模式运行容器。-p
:将容器的端口映射到主机的端口。-v
:挂载数据卷或主机目录到容器。--name
:为容器指定一个名称。
示例:
docker run -d -p 8080:80 --name mynginx nginx # 后台运行一个名为 mynginx 的 Nginx 容器,将容器的 80 端口映射到主机的 8080 端口
docker ps
列出正在运行的容器。
语法:docker ps [OPTIONS]
常用选项:
-a
:列出所有容器,包括已停止的。
示例:
docker ps # 列出正在运行的容器
docker ps -a # 列出所有容器
docker stop
停止一个或多个正在运行的容器。
语法:docker stop [OPTIONS] CONTAINER [CONTAINER...]
示例:
docker stop mynginx # 停止名为 mynginx 的容器
docker start
启动一个或多个已停止的容器。
语法:docker start [OPTIONS] CONTAINER [CONTAINER...]
示例:
docker start mynginx # 启动名为 mynginx 的容器
docker restart
重新启动一个或多个容器。
语法:docker restart [OPTIONS] CONTAINER [CONTAINER...]
示例:
docker restart mynginx # 重新启动名为 mynginx 的容器
docker rm
删除一个或多个容器。
语法:docker rm [OPTIONS] CONTAINER [CONTAINER...]
常用选项:
-f
:强制删除正在运行的容器。
示例:
docker rm mynginx # 删除名为 mynginx 的容器(需先停止)
docker rm -f mynginx # 强制删除正在运行的名为 mynginx 的容器
docker images
列出本地已有的镜像。
语法:docker images [OPTIONS] [REPOSITORY[:TAG]]
常用选项:
-a
:列出所有镜像,包括中间层镜像。
示例:
docker images # 列出本地已有的镜像
docker images -a # 列出所有镜像
docker rmi
删除一个或多个本地镜像。
语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
示例:
docker rmi ubuntu # 删除名为 ubuntu 的镜像
docker exec
在运行中的容器内执行命令。
语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
示例:
docker exec -it mynginx bash # 在名为 mynginx 的容器内打开一个交互式的 Bash 终端
docker logs
查看容器的日志输出。
语法:docker logs [OPTIONS] CONTAINER
常用选项:
-f
:跟踪日志输出,类似于tail -f
。
示例:
docker logs mynginx # 查看名为 mynginx 的容器的日志
docker logs -f mynginx # 跟踪名为 mynginx 的容器的日志输出
docker build
用于根据指定的 Dockerfile
和上下文(Context)构建 Docker 镜像。
语法:docker build [OPTIONS] PATH | URL | -
常用选项:
-t, --tag
- 为构建的镜像设置标签。例如:
docker build -t my_image:v1.
- 可以指定多个标签。
- 为构建的镜像设置标签。例如:
--build-arg
- 在构建过程中传递变量值给
Dockerfile
中的ARG
指令。例如:docker build --build-arg VERSION=1.0.
- 在构建过程中传递变量值给
--file, -f
- 指定要使用的
Dockerfile
的路径和文件名。默认情况下,Docker
会在构建上下文的根目录中查找名为Dockerfile
的文件。
- 指定要使用的
--no-cache
- 构建时不使用缓存,强制重新构建所有步骤。
--quiet, -q
- 抑制构建过程中的详细输出,仅显示构建的总体进度。
示例:
docker build -t my_app_image -f dockerfiles/Dockerfile. # 构建一个名为 my_app_image 的镜像
docker cp
用于在 Docker 容器和宿主机之间复制文件或目录。
语法:docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp [OPTIONS] CONTAINER:SRC_PATH|- DEST_PATH
常用选项:
-a
:保留文件的所有属性,包括权限、所有者、时间戳等。-L
:跟随源文件中的符号链接。
示例:
docker cp /host/path/file.txt container_name:/container/path # 将宿主机上的文件或目录复制到正在运行的容器中
docker cp container_name:/container/path/file.txt /host/path # 将容器中的文件或目录复制到宿主机
6. 容器数据卷
容器数据卷是 Docker 中用于实现数据持久化和共享的机制。它独立于容器的生命周期,可在宿主机上存在,能被挂载到容器内供其读写,确保数据在容器删除或重建后仍得以保留和访问。
使用方式
通过在 docker run
命令中使用 -v
选项来挂载数据卷到容器中。
例如:docker run -v /data/volume:/container/path image_name
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
下
可以通过docker inspect 容器id
查看容器信息
具名挂载
为数据卷指定一个名称,方便识别和管理。
创建具名数据卷:docker volume create volume_name
挂载具名数据卷:docker run -v volume_name:/container/path image_name
匿名挂载
不指定数据卷的名称,由 Docker 自动创建和管理。
例如:docker run -v /container/path image_name
,这里没有指定数据卷的名称,即为匿名挂载。
7. Dockerfile
Dockerfile 是一个用于定义 Docker 镜像构建过程的文本文件。它包含了一系列指令,Docker 引擎会按照这些指令逐步构建出所需的镜像。
常用指令
FROM
- 指定基础镜像,后续的指令将基于这个镜像进行操作。
- 示例:
FROM ubuntu:latest
RUN
- 在镜像中执行命令。
- 可以是单个命令,也可以是多个命令用
&&
连接。 - 示例:
RUN apt-get update && apt-get install -y python3
CMD
- 指定容器启动时默认执行的命令。
- 可以被
docker run
命令行参数覆盖。 - 示例:
CMD ["python3", "app.py"]
COPY
- 将宿主机上的文件或目录复制到镜像内。
- 示例:
COPY. /app
ADD
- 功能类似于
COPY
,但还可以处理 URL 和解压缩文件。
- 功能类似于
ENV
- 设置环境变量。
- 示例:
ENV MY_VARIABLE value
WORKDIR
- 设置工作目录。
- 示例:
WORKDIR /app
EXPOSE
- 声明容器运行时监听的端口。
- 示例:
EXPOSE 8080
构建镜像
使用 docker build
命令基于 Dockerfile 构建镜像。在包含 Dockerfile 的目录下执行:
docker build -t my_image:tag.
其中 -t
指定镜像的名称和标签,.
表示当前目录为构建上下文。
示例:构建Tomcat镜像
1)编写 dokerfile 文件,使用官方命名 Dockerfile。这样的话,build 时就会自动寻找这个文件,就不用加 -f 指定文件了
FROM centos:7
MAINTAINER shenxinde<552456727@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u161-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.60.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.60
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.60
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.60/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.60/logs/catalina.out
2)构建镜像
docker build -t diytomcat:1.0 .
3)run 镜像
docker run -d -p 9090:8080 --name mytomcat -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.60/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.60/logs diytomcat
8. Docker 网络
Docker 网络模式
bridge
模式(默认)- 每个容器都会被分配一个独立的网络栈,包括 IP 地址、子网掩码、网关等。
- 容器通过 Docker 内置的网桥与其他容器和宿主机进行通信。
host
模式- 容器直接使用宿主机的网络栈,与宿主机共享网络接口。
- 容器没有自己独立的网络环境,其端口与宿主机端口直接映射。
none
模式- 容器没有任何网络配置,完全隔离。
- 需要手动为容器配置网络。
container
模式- 使新创建的容器与已存在的一个容器共享网络栈。
Docker 网络命令
docker network ls
- 列出 Docker 中的所有网络。
docker network inspect <network_name>
- 查看指定网络的详细信息。
用户自定义网络
除了默认的网络模式,还可以创建自定义网络。
- 创建自定义网络
docker network create <network_name>
- 优点
- 可以更好地管理容器之间的通信和访问控制。
- 为容器分配稳定的 IP 地址。
容器间通信
- 同一网络中的容器
- 可以通过容器名称或 IP 地址相互通信。
- 不同网络中的容器
- 可以通过端口映射等方式实现通信。