Docker
Docker简介
Docker是一种开源的容器化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。这些容器可以在任何支持Docker的系统上运行,确保了应用程序的一致性和可移植性。
Docker的核心概念包括:
镜像(Image):镜像是一个轻量级、只读的模板,用于创建一个运行中的容器。它包含了运行应用所需的代码、库、环境变量和配置文件。
容器(Container):容器是镜像的运行实例。它在隔离的环境中执行应用,保持应用之间的独立性。容器可以被启动、停止、移动和删除。
仓库(Registry):Docker注册中心是存储Docker镜像的地方。Docker Hub是最著名的公共仓库,但用户也可以设置私有仓库。
Docker提供了诸如容器编排(例如使用Docker Compose)、服务扩展和负载均衡等高级功能。它的主要优势包括:
- 一致性:确保在不同环境中应用的一致运行。
- 便携性:容器可以在任何Docker环境中运行。
- 隔离性:容器之间互相隔离,提高了安全性。
- 轻量级:容器使用较少的资源,启动快。
Docker安装
Docker 支持在 Windows、CentOS、Ubantu、MacOS 等操作系统上使用
Centos中的安装
- yum源更新
yum update
- 卸载旧版本,旧版本的Docker被称为docker或docker-engine。如果已安装,则需要先将其卸载。可以使用以下命令:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装必要的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置docker的yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装docker
yum install -y docker-ce
- 查看docker版本
docker -v
设置 Docker 镜像加速器
这里参考阿里云提供的镜像加速器容器镜像服务 (aliyun.com)
自己编译脚本或者直接在命令行输入
Docker的C/S架构
Docker的常用命令
常用服务命令
命令 | 说明 |
---|---|
systemctl status docker | 查看状态 |
systemctl start docker | 启动服务 |
systemctl stop docker | 停止服务 |
systemctl restart docker | 重启服务 |
systemctl enable docker | 开启启动 |
常用镜像命令
命令 | 说明 |
---|---|
docker images | 查看镜像 |
docker search xxx | 搜索镜像 |
docker pull xxx[:version] | 拉取镜像 |
docker rmi <IMAGE ID> | 删除镜像 (删除所有可借助命令 docker images -q) |
常用容器命令
- 查看容器
docker ps
查看正在运行的容器docker ps -a
查看历史容器
- 创建容器
docker run <参数>
-i
保持容器运行,通常与 -t 连用,加入 it 两个参数后,容器创建后会自动进入到容器中,退出后,容器自动关闭-t
为容器重新分配一个新的输入终端,相当于一个 shell, 通常与 -i 联合使用-d
以守护模式(后台)运行容器,创建一个容器并在后台保持运行。需要使用docker exec
进入容器,退出后不会关闭-it
交互式容器-id
守护式容器--name
为创建的容器命名
- 拉取镜像
docker pull centos:7
- 创建一个交互式容器并且进入容器,因为是采用
-t
,所以/bin/bash
docker run -it --name=myC01 centos:7 /bin/bash
- exit 退出容器,并通过
docker ps -a
查看容器
- 创建一个守护式容器在后台运行
docker run -id --name=myC02 centos:7
- 通过
docker exec -it <容器名> /bin/bash
进入后台运行的程序
-
通过
exit
离开后,docker ps
会发现容器myC02
还在运行,这是因为使用-id
参数创建的容器,在使用exit
退出后,不会被关闭退出,需要通过docker stop <容器>
进行停止 -
启动容器
docker start <容器> # exit后仍然会保持运行
- 删除容器
docker rm <容器>
- 删除所有容器
docker rm `docker ps -a`
- 查看容器的详细信息
docker inspect <容器>
Docker容器数据卷
Docker容器数据卷(Docker Volumes)是一种机制,用于在Docker容器之间持久化和共享数据。
需要注意的是:
- 数据卷是宿主机中的目录或者文件
- 当容器目录和数据卷目录绑定后,只要修改就会立即同步
- 一个数据卷可以被多个容器挂载
- 一个容器也可以被挂在多个数据卷
在使用Docker Compose时,还可以在docker-compose.yml
文件中定义数据卷。
配置数据卷
- 在
docker run
命令中创建卷:在运行容器时,可以使用-v
或--mount
标志来创建数据卷。 - docker卷管理:也可以使用
docker volume create
创建新卷,这种方式是显式创建一个数据卷。这种方法允许您在运行容器之前先创建数据卷,然后在运行容器时通过-v
将其挂载。使用docker volume ls
查看所有卷,以及使用docker volume rm
删除卷。
docker volume create myvolume
docker run -v myvolume:/path/in/container my_image
# docker run ... -v 宿主机目录/文件:容器内目录/文件 # 最好使用绝对路径
docker run -it --name=myC03 -v /root/myData:/root/myDataContainer centos:7
目录如果不存在则会被自动创建,设置数据卷之后,宿主机和容器中两端数据同步
容器关闭或者删除之后,数据卷目录不会被删除
- 挂载多个数据卷
docker run -it --name=myC04 \ # 这里\表示回车,换行不执行
-v /root/myDataA:/root/myDataA \
-v /root/myDataB:/root/myDataB \
-v /root/myDataC:/root/myDataC \
centos:7
- 多个容器挂载在同一个数据卷
docker run -it --name=myC05 -v /root/myData:/root/myDataA centos:7
docker run -it --name=myC06 -v /root/myData:/root/myDataB centos:7
docker run -it --name=myC07 -v /root/myData:/root/myDataC centos:7
数据卷容器
在Docker中,"数据卷容器"是一种使用数据卷共享数据的模式。数据卷容器是一个普通的容器,但它被专门用来提供一个或多个数据卷给其他容器使用,相当于与是个向导。这种方法可以有效地在多个容器之间共享数据,同时保持数据的持久性和独立性。
数据卷容器的优势
- 数据共享和持久化
- 数据的独立管理
- 容器间的解耦
注意
- 数据卷容器的生命周期:即使数据卷容器被删除,挂载到这个容器的数据卷中的数据仍然会保持不变。
- 备份和迁移:可以通过备份数据卷容器来备份数据卷,或者使用数据卷的迁移和复制功能。
如何使用数据卷容器
- 创建数据卷容器:
- 首先,创建一个容器,并在其中定义一个或多个数据卷。例如:
docker run -it --name=ct -v /root/myData:/root/myData centos:7
- 使用数据卷容器的数据卷:
- 其他容器可以通过
--volumes-from
标志来挂载这个数据卷容器中的数据卷。
docker run -it --name=c01 --volumes-from ct centos:7
docker run -it --name=c02 --volumes-from ct centos:7
Docker应用部署
MySQL
- 拉取镜像
docker pull mysql:5.7
- 创建
mysql
目录
mkdir /root/mysql
- 宿主机
mysql
配置文件my.conf
,可读可写
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character_set_server=utf8
general_log=ON
general_log_file=/var/log/mysql/mysql.log
- 配置端口映射并运行
mysql
容器
# mysql默认端口是3306,这样将把容器的3306端口映射到宿主机的6033端口
docker run -id -p 6033:3306 \
--name=cMySQL \
-v /root/mysql/conf:/etc/mysql \
-v /root/mysql/logs:/var/log/mysql \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=toor \
mysql:5.7
- 进入容器
docker exec -it cMySQL /bin/bash
- 测试
mysql -uroot -p
通过centos宿主机访问
还可以通过Navicat进行本机访问,数据存在于/root/mysql/data
Redis
- 拉取镜像
docker pull redis
- 配置端口映射并运行
redis
容器
docker run -id --name=cRedis -p 6379:6379 redis
#正常Another Redis Desktop Manager通过主机地址ip连接
Tomcat
- 拉取镜像
docker pull tomcat:9
- 创建
tomcat
目录
mkdir /root/tomcat
- 配置端口映射并运行
tomcat
容器
docker run -id --name=cTomcat \
-p 8080:8080 \
-v /root/tomcat:/usr/local/tomcat/webapps \
tomcat:9
- 进入容器
docker exec -it cTomcat /bin/bash
- 测试
#在/root/tomcat中
mkdir test
vim index.html
# 写入
<h1>this is a test html</h1>
Dockerfile
将容器转换为镜像
命令 | 说明 |
---|---|
docker commit <container id> <保存后的image:tag> | 将容器保存为镜像 |
docker save -o <压缩文件名> <image:tag> | 将镜像保存为压缩文件 |
docker load -i <压缩文件名> | 将压缩文件还原成镜像文件 |
注意: | 使用 docker commit 保存的镜像,只能在保存镜像内部发生的变化,这里不包括之前通过镜像创建容器过程中挂在的数据卷 |
将容器保存后的镜像删除后,将压缩文件还原成镜像文件
使用dockerfile
当使用 Docker 构建和运行容器时,可以使用 Dockerfile 来定义容器的构建步骤。Dockerfile 是一个文本文件,其中包含一系列指令,这些指令告诉 Docker 如何构建容器镜像。
Dockerfile示例1:
# 使用基础镜像
FROM ubuntu:latest
# 设置工作目录
WORKDIR /app
# 复制当前目录下的所有文件到工作目录
COPY . .
# 安装依赖
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
# 安装 Python 应用程序的依赖
RUN pip3 install -r requirements.txt
# 暴露容器的端口
EXPOSE 80
# 定义容器启动时运行的命令
CMD ["python3", "app.py"]
Dockerfile示例2:
# 自定义 CentOS7 镜像
FROM centos:7
WORKDIR /root
RUN yum install -y vim
RUN yum install -y net-tools
CMD /bin/bash
使用 Dockerfile 构建镜像
docker build -f dockerfile文件名 -t 镜像名:版本号 .
使用镜像创建容器并进入测试docker run -it --name=容器名 镜像名:版本号
Dockerfile示例3:
部署一个 springboot 项目到 docker
FROM java:8
ADD springboot项目的jar包文件名(原名) 新名字.jar
CMD java -jar 新名字.jar
Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Docker Compose,可以使用一个单独的文件(docker-compose.yml
)来配置应用程序的服务、网络、卷等方面的设置。
Docker Compose 的安装与卸载
- 安装
# 下载到本地
curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 添加访问权限
chmod a+x /usr/local/bin/docker-compose
# 查看版本号
docker-compose -version
- 卸载
# 删除下载目录即可
rm /usr/local/bin/docker-compose -rf
操作步骤
- 使用
Dockerfile
定义运行环境镜像 - 使用
docker-compose.yml
- 运行
docker-compose up
启动应用
示例:搭建基于 Nginx 反向代理访问的 SpringBoot 项目
- 创建一个用于测试的 docker-compose 工作目录.
mkdir /root/docker-compose/nginx/conf.d -p
cd /root/docker-compose
- 编写 docker-compose.yml 配置文件
version: '3.5'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- springbootapp
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
springbootapp:
image: springbootapp
expose:
- "9527"
- 编写
/root/docker-compose/nginx/conf.d/nginx.conf
配置文件
server {
listen 80;
access_log off;
location / {
proxy_pass http://springbootapp:9527;
}
}
-
通过
docker-compose up
命令启动应用 -
通过浏览器访问
http://192.168.184.128/hello
Docker 私有仓库
创建私有仓库
#!/bin/bash
# 创建 docker 私有仓库
# 拉去私有仓库功能镜像
docker pull registry
# 启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 添加私有仓库信任配置到json配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://6jjvgl09.mirror.aliyuncs.com"],
"insecure-registries":["192.168.184.128:5000"]
}
EOF
# 重新加载 daemon.json 配置文件
systemctl daemon-reload
# 重启 docker 服务
systemctl restart docker
# 启动容器
docker start registry
上传镜像到私有仓库
# 标记镜像为私有仓库镜像
docker tag centos:7 192.168.184.128:5000/centos:7
# 上传标记的镜像
docker push 192.168.184.128:5000/centos:7
通过
192.168.184.128:5000/v2/_catalog
访问
从私有仓库拉镜像
docker pull 192.168.184.128:5000/centos:7