一, Docker 只支持 CentOS7 及以上系统, 不支持 6.x 系统
二, yum 安装 Docker
1, 安装相关环境和设置仓库
- yum install -y yum-utils device-mapper-persistent-data lvm2
- yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2, 安装 Docker 社区版
yum install docker-ce docker-ce-cli containerd.io
Docker 安装完默认未启动. 并且已经创建好 docker 用户组, 但该用户组下没有用户.
3, 启动 Docker systemctl start docker
4, 运行 hello-world docker run hello-world
三, 修改 Docker 镜像存放目录
docker 默认的存储路径在 /var/lib/docker , 但机子的数据盘挂载在 / home 目录下,
所以修改 docker 存储路径到 /home/docker 中.
1, 查找 docker.service 配置文件, 不知道配置文件在哪里可以用以下命令显示
- systemctl disable docker
- systemctl enable docker
- # 显示结果
- Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
2, 修改 docker.service 配置文件
vi /usr/lib/systemd/system/docker.service
3, 在里面的 EXECStart 找到这样一行
- ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock , 将其修改为
- ExecStart=/usr/bin/dockerd --graph /home/docker -H fd:// --containerd=/run/containerd/containerd.sock 保存并退出
4, 重载并重启 docker 服务
- systemctl daemon-reload #重载配置文件
- systemctl restart docker #重启 docker
- systemctl enable docker #设为自启动
5, 查看 docker 运行信息 docker info
其中 Docker Root Dir: /home/docker 即表示已经成功修改运行目录了
6, 重新下载和运行 hello-world 镜像
docker run hello-world
四, 容器和镜像的导入导出
镜像(Image), 就相当于是一个 root 文件系统. 比如官方镜像 Ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统.
镜像 (Image) 和容器 (Container) 的关系, 就像是面向对象程序设计中的类和实例一样, 镜像是静态的定义, 容器是镜像运行时的实体. 容器可以被创建, 启动, 停止, 删除, 暂停等.
docker images 查看镜像列表; docker ps 查看容器列表;
1, 保存容器为镜像 docker commit mycentos myos202005 mycentos 是容器名, 即现正运行的这个虚拟机的名; myos202005 是导出的虚拟机镜像名, 可用于发布, 备份等操作;
2, 导出镜像 (转格式) 为文件 docker save myos202005:latest> /home/myos202005.img
3, 导出容器 (正在运行的虚拟机) 为文件 docker export mycentos> /home/myos202005.img
4, 导入镜像, docker load --input /home/myos202005.img
5, 导入容器, docker import /home/myos202005.img myos202005
区别:
docker save 保存的是镜像(image),docker export 保存的是容器(container);
docker load 用来载入镜像包, docker import 用来载入容器包, 但两者都会恢复为镜像;
docker load 不能对载入的镜像重命名, 而 docker import 可以为镜像指定新名称.
(如果 VMware 中的虚拟机 CentOS 空间不足, 需要扩容, 参考这篇文章)
五, 运行虚拟机和进入虚拟机系统
1, 后台运行镜像(会新建一个容器)
- docker run -itd --privileged=true --name myos202005 myos202005:latest
- (注: 以特权模式运行, 容器中才能使用启动服务 systemctl 等系统命令)
2, 如果有运行过, 则应该启动容器 docker ps -a docker start 容器 ID
2, 进入容器(虚拟机), 使用 docker ps 查看容器信息, 然后 docker exec -it 容器 ID /bin/bash
3, 退出容器(虚拟机), 不关闭容器 Ctrl + P + Q
4, 关闭容器, docker stop 容器 ID ; 重启容器 docker restart 容器 ID ; 启动容器 docker start 容器 ID
5, 查看包括已退出的容器 docker ps -a ; 删除容器 docker rm 容器 ID ; 删除镜像 docker rmi 镜像 ID
PS: 容器 ID 和 容器名是等效的, 以上命令均可以用容器名替代容器 ID.
六, 虚拟机端口映射
1, 先分别查看本机和 docker 机的进程端口使用情况 netstat -nlpt
2, 查看容器列表信息 docker ps
3, 停止容器, 停止 docker 服务
docker stop 容器 ID
systemctl stop docker
4, 修改容器的配置文件, 两个配置文件都要改
- vi /var/lib/docker/containers / 容器 ID/hostconfig.JSON
- vi /var/lib/docker/containers / 容器 ID/config.v2.JSON
PS: 如果第三步修改过 docker 存放目录, 如 /home/docker, 则配置文件的位置也在相应新的位置
例如把 docker 中 MySQL 3306 端口, 映射到外面的 13306 端口, 以便远程访问 docker 中的数据库
5,hostconfig.JSON 修改
找到 PortBindings , 把那一段 JSON 修改为 "PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"13306"}]}
6,config.v2.JSON 修改
修改值 config> ExposedPorts 和 NetworkSettings> Ports
- "Config": {
- ....
- "ExposedPorts": {
- "22/tcp": {},
- "3306/tcp": {}
- },
- ....
- },
- "NetworkSettings": {
- ....
- "Ports": {
- "22/tcp":null,
- "3306/tcp": [{
- "HostIp": "",
- "HostPort": "13306"
- }],
- },
- ...
- }
7, 修改完成后先检查两个文件是否 JSON 格式正确
8, 启动 docker, 启动容器, 查看容器列表信息, 查看端口映射是否生效
systemctl start docker
docker start 容器 ID
- docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器 ID myos202005:latest "/usr/sbin/init" 3 hours ago Up 5 seconds 22/tcp, 1300/tcp, 0.0.0.0:13306->3306/tcp cranky_franklin
如上标红的 13306->3306, 则表示端口映射成功
9, 查看端口使用情况 netstat -nlpt , 可以看到 docker-proxy 进程使用 13306 端口
七, 服务器防火墙开放相应的端口
- # 查看开放的端口
- firewall-cmd --list-port
- # 添加端口(永久)
- firewall-cmd --zone=public --add-port=13306/tcp --permanent
- # 重载防火墙
- firewall-cmd --reload
如果是用的阿里云, 还有 "安全组" 策略限制了端口访问, 需要在阿里云后台操作添加端口
八, Nginx / Apache 反向代理部分域名到 docker 中
实现效果: blog.batsing.com 正常定向在服务器中, blog.demo.batsing.com 定向到 docker 中. 都是使用 80 端口.
实现过程:
1,docker 机里有内网 IP(默认 172.17.0.2)
2, 服务器可以通过此 IP 访问到 docker 中的 nginx curl 172.17.0.2:80
3, 服务器配置系统 hosts, 把 demo 域名指向 docker 内网 IP
- cat /etc/hosts
- 172.17.0.2 blog.demo.batsing.com
4,Nginx 中配置 vhost, 将 demo 域名转发到域名自身
- server {
- listen 80;
- server_name blog.demo.batsing.com;
- location / {
- proxy_pass http://blog.demo.batsing.com;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Host $http_host;
- proxy_set_header X-NginX-Proxy true;
- }
- }
转发到域名自身, 因为服务器的 hosts 配置, 所以会转发到 docker 机中, 从而实现部分域名转入到 docker 中的功能.
服务器中其他站点域名, 按 nginx 正常配置即可.
docker 中的 nginx 配置, 也是按正常配置即可, 无需另行特殊配置.
来源: https://www.cnblogs.com/batsing/p/docker.html