官方文档 https://docs.docker.com/
镜像中心
Docker基础
系统架构
容器中应用程序的运行原理
容器与虚拟机的区别
虚拟机存在独立的硬件系统与操作系统,容器是共享宿主机中的硬件系统与操作系统
镜像和容器
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像 (image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
Docker安装
- Linux中已安装Centos系统,安装Docker文档地址:https://docs.docker.com/engine/install/centos/
- 卸载旧版Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
-
配置Docker的yum库
- 首先安装yum工具:
yum install -y yum-utils
- 配置Docker的yum源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 首先安装yum工具:
-
安装Docker:
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
启动和校验
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
- 配置镜像加速(阿里云、腾讯云、华为云)
以阿里云为例,地址为:https://www.aliyun.com/
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
Docker安装镜像
Docker维护公共镜像仓库 Docker Hub,实际镜像由各软件各自维护,国内也有阿里云、腾讯云等镜像仓库。
比如部署Mysql,步骤如下:
- 安装
docker run -d \
--name mysgl \
-p 3306:3306 \
-e TZ=As ia/Shanghai \
-e MYSQL ROOT_PASSWORD=123 \
mysql
- 测试数据库是否能连接
- 查看mysql
docker inspect mysql
容器mysql3306端口不变,取决于进程,宿主机端口可以不同,再映射到同一容器端口
镜像名称不加版本号默认为最新版本,比如:nginx = nginx:latest
Docker流程
Docker常见命令
比如部署nginx,步骤如下:
镜像相关命令(此处以nginx为例)
- dockerhub搜索镜像
- 拉取镜像:
docker pull 名称
- 查看本地镜像:
docker images
- [附属] 本地打包命令帮助:
docker save --help
- [附属] 打包本地镜像:
docker save -o 名称.tar 镜像名称:版本号
eg:docker save -o nginx.tar nginx:latest
- [附属] 删除镜像:
docker rmi 镜像名称:版本号
eg:docker rmi nginx:latest
- [附属] 此时查看镜像:
docker images
- [附属] 重新加载以打包镜像命令帮助:
docker load --help
- [附属] 重新加载已打包镜像:
docker load -i 打包的文件名称
eg:docker load -i nginx.tar
容器相关命令(此处以nginx为例)
-
创建并运行容器:
docker run [-d] --name 镜像名称 -p 端口号:映射的端口号 [-e 环境变量] [-v 数据卷名:容器内目录] 镜像名称
eg:docker run -d --name nginx -p 80:80 nginx
-
查看运行中的容器状态:
docker ps
-
查看运行中容器状态按照既定格式:
docker ps --format "table [.ID)Jtf .ImagelJtl.Ports t/l.Status J tll.Names ]"
1 -
查看所有容器状态:
docker ps -a
-
查看所有容器状态按照既定格式:
docker ps --format "table [.ID)Jtf .ImagelJtl.Ports t/l.Status J tll.Names ]" -a
1 -
停止容器:
docker stop 名称
-
启动容器:
docker start 名称
-
删除容器:
docker rm 名称
-
强制删除容器:
docker rm 名称 -f
-
查看日志:
docker logs 容器名
eg:docker logs nginx
-
持续跟踪日志:
docker logs -f nginx
-
进入容器并做交互:
docker exec -it 容器名 bash
eg:docker exec -it nginx bash
,进入容器后ls -l
查看文件,可以看到一个容器内部完整独立的文件系统
eg:docker exec it mysql bash
,然后访问mysqlmysql -uroot -p
,然后输入mysql密码即可访问 -
退出容器交互:
exit
Docker数据卷
因为docker中不能用vi
等命令,所以此时需要数据卷,数据卷是一个虚拟目录,是容器目录与宿主机目录之间映射的桥梁
nginx容器与数据卷挂载
数据卷挂载流程(以nginx为例)
- 数据卷帮助命令:
docker volume --help
- 先删除原有容器:
docker rm -f 容器名称
eg:docker rm -f nginx
- 创建容器并实现数据卷挂载:
docker run -d --name 容器名称 -p 宿主机端口号:映射容器的端口号 -v 数据卷名称:容器内挂载目录(镜像文档中有容器位置目录)
eg:docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
- 查看已挂载的数据卷:
docker volume ls
- 查看具体数据卷挂载详情:
docker volume respect 数据卷名称
eg:docker volume respect html
- 去详情中的宿主机挂载位置查看是否存在挂载名称的数据卷:
cd 文件目录
- 然后查看宿主机文件,并进行编辑宿主机的文件,进而容器内文件同时改变:
cat 文件名
vi 文件名
或者用编辑器 - 最后访问浏览器输入宿主机ip,查看是否更改成功
其他容器与数据卷挂载 – 基于本地目录与数据卷的挂载
数据卷挂载流程(以mysql为例),因为mysql容器内运行过程中会不断产生数据,存放在容器内文件系统会越来越多,体积越来越大,以后迁移困难,因此出于数据解耦考虑,需要把数据挂载出去,如果用默认的匿名数据卷的话容器升级数据会丢失,所以最好自己去做数据挂载
- 查看容器是否有挂载,默认会有匿名挂载:
docker respect 容器名称
eg:docker respect nginx
- 首先进入根目录,查看目录:
cd ~
pwd
- 创建本地目录:
mkdir /
- 寻找镜像文档中配置文件、初始化脚本、放数据文件的位置,并与本地文件做挂载
docker run-d
--name mysql
-p 3306:3306
-e TZ=Asia/Shanghai
-e MYSQL_ROOT_PASSWORD=123
-v /root/mysql/data:/var/lib/mysql
-v /root/mysql/init:/docker-entrypoint-initdb.d
-v /root/mysql/conf:/etc/mysql/conf.d
mysql
- 查看是否挂载成功
docker volume ls