Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1. 卸载旧版本
# 如果安装了这些,请卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 设置存储库
# 安装yum-utils包(提供yum-config-manager 实用程序)并设置存储库。
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内可使用阿里云存储库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新源
yum makecache fast
常见问题: yum makecache: error: argument timer: invalid choice: 'fast' (choose from 'timer')
解决方案:使用 yum makecache 即可;
3. 安装 Docker 引擎
# 安装最新版本的 Docker Engine、containerd 和 Docker Compose
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
常见问题: try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages
解决方案:sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allorwerasing
4. 启动 Docker
# 启动docker
sudo systemctl start docker
# 开机启动docker
sudo systemctl enable docker
# 查看docker版本号
docker --version
5. 镜像操作
# 下载镜像 若不指定tag 默认使用latest (Using default tag: latest)
docker pull name:tag
# 以nginx为例
docker pull nginx
# 指定nginx的版本号
docker pull nginx:1.23
# 查看本地已经下载的镜像
docker images
# 删除镜像
docker rmi imageId
# 强制删除镜像
docker rmi -f imageId
6. 镜像启动
# 启动一个名为test-nginx的容器
# -d 表示后台启动 -p表示端口映射 宿主机端口: 容器内部端口
docker run --name test-nginx -d -p 8080:80 nginx
# 前台启动退出后将删除容器
docker run --rm test-nginx -d -p 8080:80 nginx
# 批量端口映射
-p 8080-9090:8080-9090
# 主机网络映射 (安全系数低不建议使用)
docker run --rm --network host --name test-nginx nginx
7. 挂载目录
# 通过 -v /data:/usr/share/nginx/html 来指定需要挂载的目录
# /data 为宿主机的目录,
# /usr/share/nginx/html 为容器内的目录
# 将当前目录下的data目录挂载到容器内的 /usr/share/nginx/html 目录
docker run --name test-nginx2 -d -p 8081:80 -v /data:/usr/share/nginx/html nginx
8. 查看日志
# 可通过容器ID或者名称查看
docker logs -f test-nginx
9. 容器操作
# 进入容器内部 -i 标准输入 -t 终端
docker exec -it test-nginx sh
# 退出容器内部
exit
# 删除容器 (如果容器在运行中则无法删除,需要先关闭容器)
docker rm test-nginx
# 关闭容器
docker stop test-nginx
# 强制删除容器
docker rm -f test-nginx
10. 网络操作
# 用于查看docker基础信息
docker inspect test-nginx
# 镜像 busybox 工具用于测试比较方便 --link 关联到其他主机(ping test-ngixn)
docker run -it --name test-nginx2 --link test-nginx busybox sh
11. Dockerfile
# 定制的镜像都是基于 FROM 的镜像, nginx 就是定制需要的基础镜像 --platform 指定平台
FROM --platform=linux/arm64 nginx
# 容器元信息 Metadata 类似于代码注释
LABEL version="1.0"
LABEL maintainer="xxx@163.com"
# Docker采用了分层技术 一条RUN命令就是一层
# 对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行
RUN yum update && yum install -y vim \
Python-dev
# 改变目录,建议使用绝对路径 若路径不存在则自动创建
WORKDIR /root
# 添加到根目录
COPY test.tar.gz /
# 添加到根目录并解压 (需要添加并解压即用ADD)
ADD test.tar.gz /
# 环境变量 (推荐使用环境变量增强可维护性) 比如设置Mysql版本号为 5.7
# 在后续的指令中可以通过 $MYSQL_VERSION 引用
ENV MYSQL_VERSION 5.7
# EXPOSE 仅仅只是声明端口 对外暴露80和443端口
EXPOSE 80
EXPOSE 443
12. 自定义Dockerfile
# 基础镜像
FROM nginx:1.23
# 指定语言
ENV LANG en_US.UTF-8
# 添加 index.html 到容器中的 /usr/share/nginx/html 目录
ADD index.html /usr/share/nginx/html
# 申明端口 暴露80和443端口
EXPOSE 80
EXPOSE 443
13. 构建镜像
# 在 Dockerfile 文件的存放目录下,执行构建动作。
# 注:最后的 . 代表本次执行的上下文路径
# 上下文路径是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
# 注:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
# 通过目录下的 Dockerfile 构建一个 nginx:0.0.1(镜像名称:镜像标签)。
docker build -t nginx:0.0.1 .
14. DockerHub
目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
14.1 、注册账号
在 Docker Hub 免费注册一个 Docker 账号。
14.2 、上传自定义镜像
# 登录dockerhub
docker login
# 注意要保证image名字 格式: 仓库名/镜像名称:镜像标签
docker tag nginx:0.0.1 nginx/nginx:0.0.1
# 推送docker image到dockerhub
docker push nginx/nginx:0.0.1
# 登录dockerhub官网检查镜像是否上传完成
# 删除本地镜像
docker rmi nginx/nginx:0.0.1
# 测试下载仓库镜像文件
docker pull nginx/nginx:0.0.1
15. DockerCompose
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
15.1 、下载
下载地址: https://github.com/docker/compose/releases
命令下载:curl -L https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
注:根据自己的环境选择下载不同的包,这里是linux环境所以选择docker-compose-linux-x86_64
15.2 、如何安装
### 手动下载 ###
# 将文件上传到服务器后重命名为 docker-compose
mv docker-compose-Linux-x86_64 docker-compose
# 创建目录
mkdir /usr/local/bin/
# 将文件移动到/usr/local/bin目录下
mv docker-compose /usr/local/bin
# CURL下载
curl -L https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 赋予文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本号
docker-compose version
15.3 、示例应用
15.4 、compose文件
15.4 、部署应用
# 构建镜像
docker-compose build
# 启动服务
docker-compose up -d
# 停止服务(--rmi all 删除所有镜像 -v 删除所有挂载)
docker-compose down --rmi all -v
# 查看日志
docker-compose logs -f
15.4 、部署测试
16. Harbor
Harbor是VMware公司开源了企业级Registry项目, 其的目标是帮助用户迅速搭建一个企业级的Docker registry服务。
16.1 、如何下载
官网地址:https://goharbor.io/
16.2 、安装前提(以安装Harbor 2.6 + 为例)
Software | Version | Description |
---|---|---|
Docker engine | Version 17.06.0-ce+ or higher | For installation instructions, see Docker Engine documentation |
Docker Compose | Version 1.18.0 or higher | For installation instructions, see Docker Compose documentation |
Openssl | Latest is preferred | Used to generate certificate and keys for Harbor |
16.3 、开始安装
# 将下载的文件上传至服务器后解压
tar -zxvf harbor-offline-installer-v2.5.3.tgz
# 进入harbor目录
cd harbor
# 重命名harbor.yml.tmpl文件为harbor.yml
mv harbor.yml.tmpl harbor.yml
# 编辑harbor.yml
vim harbor.yml
# 更改 hostname 为 IP 地址
hostname: xxx.xx.xx.xxx
# 本次安装无需HTTPS 所以注释HTTPS相关的配置
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# 执行安装脚本 (默认安装后会自动启动harbor)
sh install.sh
# 启动harbor服务
docker-compose up -d
安装成功如下图图示:
16.4 、访问测试
访问地址 :http://ip:prot
用户名 :admin
密码 :Harbor12345
16.5 、公私有库
注: 公开库上传需登录认证,下载无需登录认证,私有库上传下载都需要登录认证。
如下图所示,新建项目时 访问级别默认为私有的, 若创建公开库,请勾选公开选项。
16.6 、Docker接入Harbor私服
# 编辑daemon.json
vim /etc/docker/daemon.json
# 加入insecure-registries配置 数组中是harbor的IP地址
{
"insecure-registries": ["192.168.124.9"]
}
# 重启docker
systemctl restart docker
16.7 、上传下载
推送命令格式可以在 Harbor 中的 项目 --> 指定项目 --> 镜像仓库 --> 推送命令中可见。
标记镜像格式:
docker tag SOURCE_IMAGE[:TAG] 192.168.115.8/public/REPOSITORY[:TAG]
推送镜像格式:
docker push 192.168.115.8/public/REPOSITORY[:TAG]
# 登录
docker login 192.168.115.8
# 在公开项目中标记镜像
docker tag nginx:latest 192.168.115.8/public/nginx:0.0.1
# 推送镜像至公开项目中
docker push 192.168.115.8/public/nginx:0.0.1
# 在私有项目中标记镜像
docker tag mysql:5.7 192.168.115.8/private/mysql:0.0.1
# 推送镜像至私有项目中
docker push 192.168.115.8/private/mysql:0.0.1
# 从私服拉取镜像
docker pull 192.168.115.8/private/mysql:0.0.1