Docker
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 地址相互通信。
- 不同网络中的容器
- 可以通过端口映射等方式实现通信。
原文地址:https://blog.csdn.net/weixin_74144099/article/details/140551496
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!