Docker 运维小记

警告
本文最后更新于 2022-11-23,文中内容可能已过时。

居家必备之 Docker 运维总结。

安装 Docker

删除旧版本

1
2
3
4
5
6
7
8
sudo yum remove docker \
	docker-client \
	docker-client-latest \
	docker-common \
	docker-latest \
	docker-latest-logrotate \
	docker-logrotate \
	docker-engine

添加软件源

1
2
3
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum update

安装

1
sudo yum install docker.io

或者使用国内 daocloud 一键安装命令:

1
2
## daocloud
curl -sSL https://get.daocloud.io/docker | sh

搭建私有 DockerHub

建立 registry

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 使用 docker 进行 registry2 进行管理
docker pull registry
## 建立一个目录存放 docker 镜像, 默认是存放在 /tmp/registry
## 为了防止不小心删掉,我们将其挂载到 /data/Docker/registry 这个目录下
mkdir -p /data/Docker/registy
docker run --name docker.registry \
	-d -p 5000:5000 \
	-v /data/Docker/registy:/tmp/registry \
	registry

docker ps -a
## 开启防火墙5000端口
systemctl restart firewalld.service
firewall-cmd --zone=public --permanent--add-port=5000/tcp
firewall-cmd --reload

## 如果出现错误
## -i docker0: iptables: no chain/target/match by that name.
## Ref:https://blog.csdn.net/xujiamin0022016/article/details/108124725
systemctl restart docker

## 测试访问
curl http://127.0.0.1:5000/v2/
## 返回 {} 说明正常运行了

配置

需要配置 daemon.json 允许访问本地使用 DockerHub

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo vim /etc/docker/daemon.json

{
  "registry-mirrors" : [
    "http://ovfftd6p.mirror.aliyuncs.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn",
    "192.168.1.183:5000"
  ],
  "debug" : true,
  "experimental" : true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "1m",
    "max-file": "10"
  }
}

这里需要注意需要重启 docker 服务

1
systemctl restart docker

测试

1
2
3
4
5
6
7
8
9
## 查看当前有哪些 images
docker image ls

docker tag hello-world 192.168.1.183:5000/testing
docker push 192.168.1.183:5000/testing
docker push 192.168.1.183:5000/testing

## 可以看一下是不是有这个 repo 了
curl http://192.168.1.183:5000/v2/_catalog

常用命令

编写 Dockerfile

Centos7.9

可以使用一下的模板来编写一个测试使用的 CentOS7 开发环境

查看 centos https://hub.docker.com/_/centos?tab=tags&page=1&ordering=last_updated

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
FROM centos:centos7.9.2009

MAINTAINER WuyaCapital
LABEL Remarks="CentOS7.9 Develop&Testing Environment @WuyaCapital"

RUN yum -y install \
	sudo vim git make cmake htop\
    gcc gcc-c++ kernel-devel \
    openssl-devel libcurl-devel
RUN mkdir -p /shared/trading /data

ENV PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
ENV LANG=en_US.UTF-8
ENV BASH_ENV=~/.bashrc  \
    ENV=~/.bashrc \
    PROMPT_COMMAND="source ~/.bashrc"

EXPOSE 22 80
WORKDIR /home
CMD /bin/bash

命令说明:

  • CMD

    指定容器启动时执行的命令,注意,和RUN的区别是:RUN是在打包过程中执行的命令。镜像中只能有一条CMD指令,如果有多个CMD指令,则以最后一条为准,所以我们可以覆盖基础镜像中定义的CMD指令。CMD指令支持三种格式:

    • CMD ["executable", "param1", "param2"] 使用exec执行,这是使用CMD的首选方法
    • CMD command param1 param2 使用/bin/sh -c执行
    • CMD ["param1", "param2"] 提供给ENTRYPOINT的默认参数

    注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

  • ENTRYPOINT

    容器启动入口,即容器启动后执行的命令,不会被CMD指令覆盖,如果存在ENTRYPOINT,那么CMD指令会充当ENTRYPOINT的参数。

搭建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
docker build -t wuya-centos7:v1.0 .

docker image ls

## 使用 REPOSITORY:TAG
## 使用 -v 可以挂载主机文件
docker run --name mycentos7 --net=host -dit wuya-centos7:v1.0

## 启动实例
docker exec -it mycentos7 /bin/bash

发布 Docker

打包一个容器

1
docker commit -a "william" -m "wuya-centos7:v1.0" [container_id] image_id:version

当然,也可以直接打包成一个压缩包

1
2
3
4
5
## 打包
docker save wuya-centos7:v1.0 > mycetnos7.tar

## 加载
docker load -i mycetnos7.tar

我们也可以选择发布到 Dockerhub

1
2
3
4
5
6
docker tag wuya-centos7:v1.0 192.168.1.183:5000/wuya/centos7:v1.0
docker push 192.168.1.183:5000/wuya/centos7:v1.0
docker pull 192.168.1.183:5000/wuya/centos7:v1.0

curl http://192.168.1.183:5000/v2/_catalog
curl http://192.168.1.183:5000/v2/wuya/centos7/tags/list

这样,我们可以建立一个新的容器了

1
2
3
4
5
6
## 记得修改 vim  /etc/docker/daemon.json
docker pull 192.168.1.183:5000/wuya/centos7:v1.0
docker image ls
docker run -dit --name testing 192.168.1.183:5000/wuya/centos7:v1.0
docker ps -a
docker exec -it testing /bin/bash

Q&A

build 的时候无法使用 pip 直接安装程序

这个是因为 Docker 的 DNS 没有识别到,需要处理一下。

Ref:[Can’t install pip packages inside a docker container with Ubuntu](https://stackoverflow.com/questions/28668180/cant-install-pip-packages-inside-a-docker-container-with-ubuntu)

1
2
3
4
5
6
7
## 编辑
sudo vim /etc/default/docker
## 添加 DNS
DOCKER_OPTS="--dns 8.8.8.8"

## 重启
sudo systemctl restart docker

相关内容

william 支付宝支付宝
william 微信微信
0%