Docker
# 删除匿名镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
# 启动frps (image为snowdreamtech/frps:0.51.3)
docker run --restart=always -d \
--network host \
-v /etc/localtime:/etc/localtime:ro \ # 同步宿主机时间配置 \
-v /etc/frp/frps/frps.ini:/etc/frp/frps.ini \ # 映射frpc配置文件 \
-v /var/log/frps.log:/var/log/frps.log \ # 映射日志文件目录 \
--name=frps \
snowdreamtech/frps:0.51.3
# 启动frpc (image为snowdreamtech/frpc:0.51.3)
docker run --restart=always -d \
--network host \
-v /etc/localtime:/etc/localtime:ro \ # 同步宿主机时间配置 \
-v /etc/frp/frpc/frps.ini:/etc/frp/frpc.ini \ # 映射frpc配置文件 \
-v /var/log/frps.log:/var/log/frps.log \ # 映射日志文件目录 \
--name=frpc \
snowdreamtech/frpc:0.51.3
安装Docker
卸载旧版本
旧版本的 Docker 被称为docker
,docker.io
或docker-engine
. 如果安装了这些,请卸载它们:
sudo apt-get remove docker docker-engine docker.io containerd runc
如果 apt-get
报告没有安装这些软件包,那也没关系。
安装方法
您可以根据需要以不同的方式安装 Docker Engine:
- 大多数用户 设置 Docker 的存储库并从中安装,以便于安装和升级任务。这是推荐的方法,除了 Raspbian。
- 一些用户下载 DEB 包并 手动安装,完全手动管理升级。这在诸如在无法访问 Internet 的气隙系统上安装 Docker 等情况下很有用。
- 在测试和开发环境中,一些用户选择使用自动化 便利脚本来安装 Docker。这是目前 Raspbian 的唯一方法。
🔺使用存储库安装
在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 Docker。
(一) 设置存储库(注意设置中的系统版本)
更新
apt
包索引并安装包以允许apt
通过 HTTPS 使用存储库:sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
添加 Docker 的官方 GPG 密钥(debian):
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
使用以下命令设置存储库(debian):
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
(二) 安装 Docker 引擎
此过程适用于 x86_64
/ amd64
、 armhf
、 arm64
和 Raspbian 上的 Debian。
🔺更新
apt
包索引,安装最新版本的 Docker Engine、containerd 和 Docker Compose :或者进入下一步安装特定版本
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装:
a. 列出您的存储库中可用的版本:
apt-cache madison docker-ce docker-ce | 5:18.09.1~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages docker-ce | 5:18.09.0~3-0~debian-stretch | https://download.docker.com/linux/debian stretch/stable amd64 Packages docker-ce | 18.06.1~ce~3-0~debian | https://download.docker.com/linux/debian stretch/stable amd64 Packages docker-ce | 18.06.0~ce~3-0~debian | https://download.docker.com/linux/debian stretch/stable amd64 Packages
b. 使用第二列中的版本字符串安装特定版本,例如
5:18.09.1~3-0~debian-stretch
.sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
hello-world
通过运行映像来验证 Docker 引擎是否已正确安装。sudo docker run hello-world
此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。
Docker 引擎已安装并正在运行。该docker
组已创建,但未向其中添加任何用户。您需要使用sudo
来运行 Docker 命令。继续Linux 安装后步骤以允许非 root 用户运行 Docker 命令和其他可选配置步骤。
升级 Docker 引擎
要升级 Docker Engine,首先运行sudo apt-get update
,然后按照 安装说明,选择您要安装的新版本。
安装示例 (Debian)
apt-get update apt-get install ca-certificates curl gnupg lsb-release mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
卸载 Docker 引擎
卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包:
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷:
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
必须手动删除任何已编辑的配置文件。
Docker 命令
Docker 服务相关命令
- 启动docker服务
systemctl start docker
- 停止docker服务
systemctl stop docker
- 重启docker服务
systemctl restart docker
- 查看docker服务状态
systemctl status docker
- 设置开机启动docker服务
systemctl enable docker
Docker 镜像相关命令
- 查看镜像 (本地)
docker images
dockdocker images -q # 查看所有镜像的ID
- 搜索镜像
docker search [imageName]
- 拉取镜像
docker pull [imageName]:[version(默认最新)]
- 删除镜像 (本地)
docker rmi [imageName]:[version]
docker rmi [ID]
删除所有镜像
docker rmi `docker images -q`
Docker 容器相关命令
容器:由镜像和文件运行,所产生的实例
- 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
STATUS
运行状态
Up
运行中的容器
Exited
已经退出的容器
- 创建容器
docker run -it --name=[ContainerName] [imageName]:[version] /bin/bash
-i
容器保持运行
-t
创建之后分配一个伪输入终端( Terminal )并自动进入容器通过
exit
指令退出后,容器将自动关闭通常与
-i
同时使用
--name
为创建的容器命名ContainerName
容器名称
/bin/bash
进入容器后的初始化指令( 默认执行 )
docker run -id --name=[ContainerName] [imageName]:[version]
-d
以守护模式运行容器( 后台运行创建容器,不自动进入 )需要使用
docker exec
手动进入容器通过
exit
指令退出后,容器 不会自动关闭
-it
创建的容器一般称为交互式容器,-id
创建的容器一般称为守护式容器
- 进入容器
docker exec -it [ContainerName] /bin/bash
通过 exit
指令退出后,容器 不会自动关闭
- 启动容器
docker strat [ContainerName/ContainerID]
- 停止容器
docker stop [ContainerName/ContainerID]
- 删除容器
docker rm [ContainerName/ContainerID]
- 查看容器信息
docker inspect [ContainerName/ContainerID]
Docker 容器的数据卷
数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器可以挂载多个数据卷
数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
创建启动容器时,使用 -v
参数 设置数据卷
docker run ... [-v 宿主机目录(文件):容器内目录(文件)] ...
注意:
目录必须是绝对路径
若目录不存在,将自动创建
可以挂载多个数据卷
数据卷容器
多容器进行数据交换
- 多个容器挂载同一个数据卷
- 数据卷容器
配置数据卷容器
- 创建启动
dataContainer
数据卷容器,使用-v
参数 设置数据卷
docker run -it --name=dataContainer -v /volume debian:10.3 /bin/bash
- 创建启动
c1
c2
容器,使用--volumes-from
参数 设置数据卷
docker run -it --name=c1 --volumes-from dataContainer debian:10.3 /bin/bash
docker run -it --name=c2 --volumes-from dataContainer debian:10.3 /bin/bash
Docker 应用部署
MySQL部署
在 Docker
容器中部署 MySQL
,并通过外部MySQL客户端操作 MySQL Server
- 搜索MySQL镜像
- 拉取MySQL镜像
- 创建容器
- 操作容器中的MySQL
搜索MySQL镜像
docker search mysql
拉取MySQL镜像
docker pull [mysql:x.x]
创建容器,设置端口映射、目录映射
# 在 /root 目录下创建 mysql 目录用于存储 mysql 数据信息 mkdir ~/mysql cd ~/mysql
docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v PWD/conf:/etc/mysql/conf.d \ -v PWD/logs:/logs \ -v PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:x.x
参数说明:
-p 3307:3306
:将容器的 3306 端口映射到宿主机的 3307 端口-v PWD/conf:/etc/mysql/conf.d
:将主机当前目录下的conf/my.cnf
挂载到容器的etc/mysql/my.cnf
配置目录
-v PWD/logs:/logs
:将当前主机目录下的logs
目录挂载到容器的/logs
日志目录
-v PWD/data:var/lib/mysql
:将当前主机下的data
目录挂载到容器的/var/lib/mysql
数据目录
-e MYSQL_ROOT_PASSWORD=123456
:初始化root
用户的密码
进入容器,操作MySQL
docker exec -it c_mysql /bin/bash
使用外部机器连接容器中的MySQL
Dockerfile
Docker 镜像原理
Docker 镜像本质:分层文件系统
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
Linux 文件系统由
bootfs
和rootfs
两部分组成
bootfs
:包含bootloader
(引导加载程序) 和kernal
(内核)
rootfs
:root文件系统,包含的就是典型 Linux 系统中的/dev, /proc, /bin, /etc 等标准目录和文件
- 不同的 Linux 发行版,bootfs 基本一样,而 rootfs 不同
Docker 镜像是由特殊的文件系统叠加而成
最底端是
bootfs
,并使用宿主机的bootfs
第二层是
root
文件系统rootfs
,称为base image
然后再往上可以叠加其他的镜像文件
统一文件系统 (Union File System) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
Docker 镜像制作
1. 容器转为镜像
docker commit 容器id 镜像版本:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称
2. Dockerfile
Dockerfile 是一个文本文件
- 包含了一条条指令
每一条指令构建一层,基于基础镜像,最终构建出一个个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿到开发时所构建的镜像,或者通过 Dockerfile 文件构建一个新的镜像开始工作
对于运维人员:在部署时可以实现应用的无缝移植
Dockerfile 关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于哪个image构建 |
MAINTAINER | 作者信息 | 用来标明dockerfile作者信息 |
LABLE | 标签 | 用来标明dockerfile的标签 可以使用Lable代替Maintainer 最终都是在dicker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是 /bin/bash 格式: RUN command 或者 RUN ["commmand","param1","param2"] |
CMD | 容器启动命令 | 提供启动容器时的默认命令 和ENTRYPOINT配合使用 格式: CMD command param1 param2 或者 CMD ["command","param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行完就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时的环境变量 可以在启动容器的时候通过 -e 覆盖格式: ENV name=value |
AGE | 构建参数 | 旨在构建时使用的参数 如果有ENV 那么ENV同名值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image哪些目录可以在启动时挂载到文件系统中 启动容器时用 -v 绑定 格式: VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行时监听的端口 启动容器时使用 -p 绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 若不存在则将自动创建 如果指定/开头 使用的是绝对路径 如果不是/开头 那么是在上一条workdir路径的相对路径 |
USER | 指定执行用户 | 指定build或启动时的用户 在RUN CMD ENTRYPOINT执行时的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康测试的命令 基本上没用 多数应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像时 执行FORM完成之后会执行ONBUID命令 不影响当前镜像 用处不大 |
STOPSIGNAL | 发送信号量到宿主机 | 该指令设置将发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令时使用的shell |
Dockerfile 案例
1. 自定义Debian
案例:需求
自定义debian镜像,要求:
- 默认登录路径为
usr
可以使用
vim
FROM debian:10.3 MAINTAINER test <test@163.com> RUN apt-get update && apt-get -y install vim WORKDIR /usr CMD /bin/bash
案例:实现步骤
- 定义父镜像:
FROM debian:10.3
- 定义作者信息:
MAINTAINER name <email>
- 执行安装
vim
命令:RUN apt-get update && apt-get -y install vim
- 定义默认的工作目录:
WORKDIR /usr
- 定义容器启动执行的命令:
CMD /bin/bash
通过 dockerfile 构建镜像:
docker build -f [dockerfilePath] -t [newImageName]:[version] .
docker build -f ./bebian_dockerfile -t test:1.0 .
2. 部署SpringBoot
案例:需求
定义dockerfile,发布springboot项目
FROM java:8 MAINTAINER test <test@163.com> ADD springbootPackage.jar app.jar CMD java -jar app.jar
案例:实现步骤
- 定义父镜像:
FROM java:8
- 定义作者信息:
MAINTAINER name <email>
- 将 jar 包添加到容器:
ADD springbootPackage.jar app.jar
- 定义容器启动执行的命令:
CMD java -jar app.jar
通过 dockerfile 构建镜像:
docker build -f [dockerfilePath] -t [newImageName]:[version] .
docker build -f ./springboot_dockerfile -t app .
Docker 服务编排
Docker Compose
编排多容器分布式部署,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
- 利用
Dockerfile
定义运行环境镜像- 使用
docker-compose.yml
定义组成应用的各服务- 运行
docker-compose up
启动应用
安装 Docker Compose
apt-get install docker-compose
查看 Docker Compose
版本
docker-compose -version
若提示
-bash: /usr/local/bin/docker-compose: No such file or directory
, 设置软连接到指定目录:ln -s /usr/bin/docker-compose /usr/local/bin/docker-compose
若提示
-bash: /usr/local/bin/docker-compose: Permission denied
, 添加执行权限:chmod +x /usr/local/bin/docker-compose
# Compose目前已经完全支持Linux、MacOS和Windows, 在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。 curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 设置文件可执行权限 chmod +x /usr/local/bin/docker-compose # 查看版本信息 docker-compose -version
卸载 Docker Compose
apt-get remove docker-compose
apt-get autoremove docker-compose
旧版(已失效)
# 二进制包方式安装,删除二进制文件即可 rm /usr/local/bin/docker-compose
使用 Docker Compose 编排 Nginx+SpringBoot 项目
创建
docker-compose
目录mkdir ~/docker-compose cd ~/docker-compose
编写
docker-compose.yml
文件version: '3' services: nginx: image: nginx ports: - 80:80 links: - app volumes: - ./nginx/conf.d:/etc/nginx/conf.d app: image: app expose: - "8080"
创建
./nginx/conf.d
目录mkdir -p ./nginx/conf.d
在
./nginx/conf.d
目录下编写config.conf
文件server { listen 80; access_log off; location / { proxy_pass http://app:8080; } }
在
~docker-compose
目录下使用docker-compose
启动容器docker-compose up
测试访问
http://[ip]:[port]/hello