文章目录
1. 简介
docker
是一个用于开发,交付和运行应用程序的开放平台。docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux
机器上,也可以实现虚拟化。- 在开发和交付软件时,经常遇到开发和实际使用的环境:操作系统、
gcc
版本以及依赖的其他三方软件库版本不一致,导致软件运行不起来。此时可以直接将要发布的软件、操作系统以及依赖软件库打包进一个docker
容器环境中,直接发布容器包。使用时直接在目标主机上加载docker
容器就可以完全复原开发运行环境,避免反复配置开发环境的繁琐步骤。
2. 安装
2.1 联网安装
在centos7下可以使用如下yum 命令进行安装
yum install docker-ce docker-ce-cli containerd.io
2.2 离线安装
-
docker离线安装可以参考官方文档:Install Docker Engine from binaries | Docker
Documentation -
进入官网, 下载安装包
-
解压
tar -zxvf docker-20.10.9.tgz
-
cp docker/* /usr//bin
-
将docker 注册为服务
vi /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
- 添加执行权限 chmod +x /etc/systemd/system/docker.service
- 重新加载配置文件 systemctl daemon-reload
- 启动docker systemctl start docker
- 设置开机自动启动 systemctl enable docker.service
- 查看docker状态 systemctl enable docker.service
2.3 版本升级
- 查看当前安装的docker 软件:rpm -qa | grep docker
- 删除当前docker软件:yum -y remove docker-common-1.13.1-209.git7d71120.el7.centos.x86_64
- yum list installed |grep docker
- 备份docker目录:mv /var/lib/docker /var/lib/docker.old
- 停止docker服务,systemctl stop docker
- 进入docker软件网站下载指定版本的docker依赖软件,主要包括:docker-ce-版本.rpm、docker-ce-cli-版本.rpm
- rpm -ivh .rpm 或者通过yum在线安装yum -y upgrade docker-ce-19.03.15-3.el7.x86_64.rpm docker-ce-cli-19.03.15-3.el7.x86_64.rpm*
- 重启docker服务:systemctl start docker
3. 常用操作
docker 操作主要分为:镜像、容器
- docker镜像简单理解为一个操作系统
- docker容器简单理解为基于docker镜像搭建的开发环境,我们可以使用同一个镜像创建多个docker容器,然后在各个容器中根据需求安装用到的环境,不同的容器之间是相互独立的
3.1 基本操作
3.1.1 docker 服务
使用docker环境,必须先启动docker服务
-
开启/重启docker服务
systemctl start/restart docker
-
关闭docker服务
systemctl stop docker
3.1.2 docker 信息
-
查看docker信息:总的容器数量、正在运行的数量、docker根目录、版本
docker info
3.2 docker 镜像
docker 镜像就类似于系统,我们将系统安装到机器上就形成了一个运行环境,即容器
服务器上安装完成docker环境后,需要通过启动镜像生成开发运行环境:容器,这时主要涉及到命令docker run
-
启动docker镜像,生成docker容器
最简单的启动命令直接进行docker run- 启动镜像(随机生成容器名):
docker run -it 镜像名称 /bin/bash
- 启动镜像并指定生成的容器名称,使用**–name**参数:
docker run -itd --name ubuntu_test ubuntu /bin/bash
- 生成新容器并指定端口映射,使用**-p**参数:
docker run -it -d --name [容器的名字] -p 宿主端口号:容器端口号 [镜像名字] /bin/bash
- –gpus all: 容器中加载gpu卡信息
- -v: 指定映射目录,docker 容器内和服务器宿主机之间的目录默认不共享,通常需要在生成容器时指定映射目录,-v 宿主机目录:容器目录,这样两个目录中的文件是共享的
- –shm-size :指定容器缓存大小,不指定时运行一些程序会提示缓存太小
- –privileged:使容器拥有一些超级权限
结合上面启动镜像常用的参数,一个综合命令启动镜像如下:
docker run -itd --name develop_env -v /data1:/data1 -v /mnt:/mnt -p 1234:1234 -p 5678:22 --shm-size="32g" --privileged=true --gpus all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all centos7.6:v1.0 /usr/sbin/init
上述命令作用为:
基于centos7.6:v1.0 这个镜像生成一个名为develop_env的容器
容器将本机的 /data1 目录映射到容器的 /data1 目录,本机 /mnt 目录映射到容器的 /mnt 目录
容器分别将本机 1234、5678 端口映射到容器的1234、22 端口
容器的缓存为32g
将宿主机所有的gpu卡设备映射到容器中 - 启动镜像(随机生成容器名):
-
其他镜像命令
-
列出所有镜像
docker images
-
修改镜像名称
docker tag imageId(镜像ID) respository:tag(仓库:标签)
-
3.3 docker 容器
-
显示所有容器:
docker ps -a
-
显示正在运行的容器:
docker ps
-
启动容器:
docker start 容器ID
-
进入已经启动的容器:
docker exec -it 243c32535da7 /bin/bash
-
停止容器:
docker stop 容器ID
-
重启容器:
docker restart 容器ID
-
删除容器:
docker rm -f 容器ID
-
将容器导出为镜像:
docker export -o test-`date +%Y%m%d`.tar 容器ID
此时导出的镜像名字为test-日期.tar,可以将镜像拷贝到其他服务器实现环境复现
-
导入镜像:
docker import test-20221012.tar develop/test:v1.0
-
查看容器详细信息
docker inspect 容器ID
4. 存储目录迁移
docker 默认的存储目录为 /var/lib/docker,当存储目录空间不足时,需要对docker存储目进行迁移
-
docker 默认的存储目录为 /var/lib/docker,当存储目录空间不足时,需要对docker存储目进行迁移
-
迁移 /var/lib/docker目录
-
创建新的docker目录, 通过
df -h
找一个大的磁盘,如:/mnt/a
mkdir -p /mnt/a/docker/lib
-
迁移 /var/lib/docker目录下的文件到 /mnt/docker/lib下
cp -r /var/lib/docker /mnt/a/docker/lib
-
配置 /etc/systemd/system/docker.service.d/devicemapper.conf。查看devicemapper.conf是否存在,不存在,则新建。
- mkdir -p /etc/systemd/system/docker.service.d/
- vim /etc/systemd/system/docker.service.d/devicemapper.conf
- 写入配置:在devicemapper.conf写入以下内容:
[Service] ExecStart= ExecStart=/usr/bin/dockerd --graph=/mnt/a/docker/lib/docker
-
重新加载docker
systemctl daemon-reload
systemctl restart docker
- 检查存储目录是否修改成功
# 查看Docker Root Dir 是否修改
docker info
- docker images 检查镜像是否都存在
- 确定镜像可以正常启动后删除**/var/lib/docker**目录中备份的文件
5. 远程连接docker容器
远程连接docker容器可以让一些操作更加方便,例如可以使用vscode远程调试容器中的程序环境、可以将容器当作正常服务器连接使用,不必再登陆宿主机。
具体配置步骤如下:
-
创建容器(映射宿主机端口)
docker run -itd -v /data:/data -p 12345:22 --shm-size="32g" --privileged=true --name=testDocker centos7.6:v1.0 /usr/sbin/init
–privileged=true、/usr/sbin/init 主要是为了给容器添加重启ssh权限
-
进入容器
docker exec -it testDocker /bin/bash
-
安装ssh服务
yum -y install openssh-server
-
设置root密码 passwd
-
修改ssh配置
vim /etc/ssh/sshd_config 注释PermitRootLogin prohibit-password #PermitRootLogin prohibit-password 添加PermitRootLogin yes
-
重启ssh服务
systemctl restart sshd
-
本机连接容器或者远程连接容器
ssh -p 12345 root@0.0.0.0 ssh -p 12345 root@192.168.x.xx
PS: 可能需要开放端口防火墙权限
6. 镜像上传远程仓库
一个打包好的镜像可以上传到远程云仓库,作为备份使用,具体步骤如下:
-
进入docker远程仓库网站https://hub.docker.com/注册用户
-
在远程网站创建仓库,如:user/centos7.6
-
在服务器中登录docker用户
docker login
-
将服务器中的镜像名称修改为远程仓库的名称:
docker tag 镜像ID 用户名称/镜像源名称:新的标签名称 docker tag centos7.6:v1.0 user/centos7.6:v1.0
-
将镜像推送到远程仓库
docker push <hub-user>/<repo-name>:tag docker push user/centos7.6:v1.0
7. 问题
7.1 添加docker用户组
需要管理员权限将普通用户加入docker用户组中,不然普通用户启动docker会提示权限问题,具体操作如下:
service start /var/run/docker.sock
sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker