警告
本文最后更新于 2021-06-22,文中内容可能已过时。
安装 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
|