Docker安装与基本操作
1.安装docker
# 安装官方镜像源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker,安装docker会同时安装docker-comose
sudo yum install docker-ce -y
# 当前用户加入docker组
sudo usermod -aG docker $USER
# 验证安装
docker version
docker compose version
# 添加docker自动补全,自动补全仓库https://github.com/docker/cli/blob/master/contrib/completion/bash/docker,点击Raw等到文件地址
sudo yum install bash-completion
sudo curl https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
# 重启主机后生效
2.镜像加速
# 查看是否在docker.service中配置过镜像加速
systemctl cat docker | grep '\-\-registry\-mirror'
# 如果上面有输出,删除ExecStart=后面的--registry-mirror参数和值
sudo vi /usr/lib/systemd/system/docker.service
# 如果没有输出
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
3.镜像
# 获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:18.04
# 查看镜像
docker image ls
# 运行镜像
docker run -it --rm ubuntu:18.04 bash
# 查看镜像占用空间
docker system df
# 删除本地镜像
docker image rm feb5d9fea6a5
4.容器
# 新建一个容器
docker run ubuntu:18.04 /bin/echo 'Hello world'
# 查看运行中的容器
docker container ls
# 查看所有容器
docker container ls -a
# 查看容器详细信息
docker inspect web # web是容器名称
# 运行一个退出的容器
docker container start a50780376548
# 重启一个运行的容器
docker container restart a50780376548
# 停止一个运行的容器
docker container stop a50780376548
# 删除一个容器
docker container rm 2fe532c871f6
docker container prune # 删除所有处于停止状态的容器
# 进入容器
docker attach a9b1a5a0ea7c # exit会导致容器停止
docker exec -it 69d1 bash # exit后容器不会停止
docker run常用的选项
-
-i 交互式,即保留住窗口
-
-t 打开终端
-
--name 给容器指定一个名字
-
-d 保持后台运行(通过docker container logs [container ID or NAMES]看到后台容器的输出)
-
--rm 运行后删除容器
-
-v 可以把宿主机目录挂载到容器中,供容器使用,这样宿主机目录的修改就可以反应到容器上
-
-p(-P),可以把宿主机的端口和容器的端口映射,-P宿主机随机一个端口和容器映射。-p可以指定宿主机端口 -p 80:80是把宿主机的所有IP的80端口和容器映射,-p 127.0.0.1:80:80是只把127.0.0.1的地址80端口和容器映射
docker run --name myweb -d -p 10.206.132.229:80:80 -v /data/www:/usr/share/nginx/html nginx:latest
5.数据管理
数据管理可以实现容器之间数据的共享也可以实现宿主机更新文件实时反应到容器中
5.1.数据卷
# 创建数据卷
docker volume create my-vol
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my-vol
# 挂载数据卷
docker run -d -P --name web --mount source=my-vol,target=/usr/share/nginx/html nginx:alpine
# --mount可以用-v my-vol:/usr/share/nginx/html代替
# 删除数据卷
docker volume rm my-vol
# 删除没有引用的数据卷
docker volume prune
5.2.挂载宿主机目录
docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html nginx:alpine
# 其中mount可以被-v /src/webapp:/usr/share/nginx/html代替
5.3.修改新建数据卷默认位置
新建数据卷默认在/var/lib/docker/volumes
下,可能不符合实际需求
sudo vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 修改为
ExecStart=/usr/bin/dockerd --data-root /data/docker/volumes -H fd:// --containerd=/run/containerd/containerd.sock
sudo systemctl daemon-reload
systemctl restart docker
对旧有的volume,需要在新位置里面建立一个软连接到旧volume
6.网络
6.1.宿主机容器端口映射
# 随机映射端口
docker run -d -P nginx:alpine
# 指定映射端口
docker run -d -p 80:80 nginx:alpine
# 映射到指定地址端口
docker run -d -p 127.0.0.1:80:80 nginx:alpine
# 映射到任意端口
docker run -d -p 127.0.0.1::80 nginx:alpine
# 映射udp端口
docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
# 映射多个端口
docker run -d -p 80:80 -p 443:443 nginx:alpine
# 查看你映射端口
docker port myweb 80
6.2.容器网络互联
和虚拟机中的hostonly网络一样
# 新建网络 -d 参数指定 Docker 网络类型,有 bridge overlay
docker network create -d bridge my-net
# 指定网络,打开一个终端执行
docker run -it --rm --name busybox1 --network my-net busybox sh
# 再打开一个终端执行
docker run -it --rm --name busybox2 --network my-net busybox sh
# ip addr可以看到busybox1和2的IP
ping busybox1
查看docker中的网络情况
# 查看有哪些网络
docker network ls
# 查看某一个网络的详细信息,例如被哪些容器使用
docker network inspect lsky-pro-docker_lsky-net
7.定制镜像并上传DockerHub
mysql官方镜像使用mysql用户启动数据库,mysql的uid和gid是999,但宿主机新建用户是从1000开始的,这样导致启动容器的用户和容器内的用户不一样,权限会错乱,详见:Docker配置mysql,决定定制一个1000uid和gid的mysql镜像
7.1.DockerHub新建账号
7.2.新建Dockerfile
Dockerfile和docker-entrypoint.sh可以直接参考docker官方的Docker官方mysql镜像制作
cd /data/mysql
vi Dockerfile
# Dockerfile可以直接复制官方的,不过要修改uid和gid为1000
RUN set -eux; \
groupadd --system --gid 1000 mysql; \
useradd --system --uid 1000 --gid 1000 --home-dir /var/lib/mysql --no-create-home mysql
vi docker-entrypoint.sh
# docker-entrypoint.sh可以直接复制官方的,但是要注意增加执行权限
chmod +x docker-entrypoint.sh
7.3.搭建镜像
# -t就是镜像的tag,monkey6是注册的DockerHub账号
docker build -t monkey6/mysql:5.7 .
7.4.上传镜像
# 第一次登陆需要用户名和密码,之后密码会存放到本地,下次登陆就不需要了
docker login
docker push monkey6/mysql:5.7
8.容器升级
# 找到docker-compose.yml所在位置
docker compose ls
# 进入docker-compose.yml所在目录
docker compose pull
# 重启容器
docker compose up -d --remove-orphans
# 删除旧镜像
docker image prune
# 也可以使用watchtower这个容器来升级容器,下面的命令升级rabbitpro镜像并启动容器
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -c --run-once rabbitpro