Docker
1. 安装
配置 163 yum 镜像源:挖坑另一篇yum源配置文章
卸载老版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装
Install Docker Engine on CentOS
RHEL7.8 成功,RHEL7.0 版本失败
配置yum源
Install the yum-utils
package (which provides the yum-config-manager
utility) and set up the stable repository.
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 官方源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 DOCKER ENGINE
Install the latest version of Docker Engine and containerd, or go to the next step to install a specific version:
sudo yum install docker-ce docker-ce-cli containerd.io
Start Docker.
sudo systemctl start docker
sudo systemctl enable docker
Verify that Docker Engine is installed correctly by running the hello-world
image.
sudo docker run hello-world
2. 中央仓库
- 官方:https://hub.docker.com/
- daoCloud:http://hub.daocloud.io/
- 网易蜂巢:http://c.163yun.com/hub#/home
3. 镜像操作
拉取
# docker pull repo:tag
docker pull daocloud.io/library/tomcat:8.5.15-jre8
查看
docker images
删除
# docker rmi image_id一部分
# docker rmi repo:tag
# 如果有container使用该image,则会报错,需要先执行docker rm <container>
docker rmi b8
本地导入导出(不规范)
# docker save -o /path/to/save image_id一部分
docker save -o tomcat.docker b8
# 导入,repo和tag会成为<none>
docker load -i ./tomcat.docker
改名字
# docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag b8 tomcat:8
4. 容器的操作
运行 run
# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# -d 后台运行
# -p 端口映射 Publish a container's port(s) to the host
# --name 指定名字
# --restart=always 随docker启动
docker run -d -p 8080:8080 --name tomcat --restart=always b8
查看 ps
# -q 只显示id
# -a 全部,包含已停的
docker ps -qa
日志 logs
# docker logs [OPTIONS] CONTAINER
docker logs -f b8
进入 exec -it
docker exec -it id bash
停止 stop
docker stop id
启动 start
docker start id
删除 rm
docker rm id
# 删除全部
docker rm $(docker ps -qa)
拷贝 cp
# docker cp [OPTIONS] SRC_PATH <-> CONTAINER:DEST_PATH
# container和host之间cp文件
docker cp anaconda-ks.cfg ff:/usr/local/tomcat
5. 数据卷 Volume
将宿主机目录映射到容器内部目录
创建 create
# 默认存放路径 /var/lib/docker/volumes/<volume_name>/_data/
docker volume create my_data
查看 ls
# 查看所有volume
docker volume ls
inspect
docker volume inspect my_data
绑定
卷名:容器内部路径
# 数据卷不存在时,会自动创建。
# 容器内文件会同步到宿主机目录
docker run -v 卷名:容器内部路径 image_id
路径:容器内部路径
# 不会创建卷
# 文件不会同步到宿主机
# 推荐使用
6. Network
none
--network none
默认 bridge
container 之间互通
实验
安装工具包,后面brctl
命令要使用
sudo yum install bridge-utils
没有任何容器时,仅有默认 docker0 bridge
启动 2 个容器
docker run --name demo1 --rm -it busybox /bin/sh
docker run --name demo2 --rm -it busybox /bin/sh
可以看到 interface 都在 docker0 内
ifconfig 也可以看到多了 2 个网络
ip addr show
可以看到 interface 编号,与容器内部编号一起可确定使用的是哪个
自定义网络
network 内互通
与默认和其他 network 不通
通外网
实验
docker run --name demo1-base1 --rm -it busybox /bin/sh
docker network create demo-bridge
[root@MiWiFi-R2D-srv ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
393e8266e38e bridge bridge local
<7f1c596d3dd2> demo-bridge bridge local
0aff98e48e08 host host local
7f58aba78a99 none null local
[root@MiWiFi-R2D-srv ~]# ifconfig
br-<7f1c596d3dd2>: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 --> 命名规则 br-<id>,与 network id 对应
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:5d:9d:b5:47 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11 bytes 1556 (1.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...省略...
docker run --name demo1-base2 --network=demo-bridge --rm -it busybox /bin/sh
通过自动添加宿主机 iptables 规则,实现 base1 和 base2 隔离,从 base1 无法 ping 通 base2 ip。
iptables -t nat -L -n
# MASQUERADE all -- 172.19.0.0/16 0.0.0.0/0
指定 gateway,subnet, ip range
docker network create --help
docker network create --gateway="10.10.10.1" --subnet="10.10.0.0/16" --ip-range="10.10.10.0/24" demo2-bridge
命令
docker network --help
docker network create --help
7. Dockerfile
:book:官方 doc#Dockerfile reference
:book:Runoob#Dockerfile
创建 Dockerfile
FROM daocloud.io/library/nginx:latest
RUN echo "Hello nginx!!!!!!!!" > /usr/share/nginx/html/index.html
RUN
用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
EXPOSE
声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
制作镜像
docker build -t 镜像名[:tag]
8. Docker Compose
安装
下载
Option1: Compose repository release page on GitHub下载
Option2: 使用以下命令下载:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
:warning:我的环境中遇到如下错误,只能使用 Option 1.
curl: (7) Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; Connection refused
部署并测试
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
docker-compose.yml
version: "3"
services:
tomcat:
build: # 自定义镜像
context: ../
dockerfile: Dockerfile
restart: always
image: daocloud.io/library/tomcat:8.5.15-jre8
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
volumes:
- /opt/docker_volumes/tomcat/webapps:/usr/local/tomcat/webapps
- /opt/docker_volumes/tomcat/logs:/usr/local/tomcat/logs
docker-compose up -d
运行
命令
# 启动
docker-compose up -d
# 开|关|重启
docker-compose start|stop|restart
# 查看
docker-compose ps
# 查看日志
docker-compose logs -f
# 关闭并删除
docker-compose down
自定义镜像
docker-compose.yml
version: "3"
services:
tomcat:
build: # 自定义镜像
context: ./tomcat
dockerfile: Dockerfile # 在Dockerfile中FROM指定image
restart: always
image: my_tomcat:0.0.1 # 生成的container name:tag
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
命令
# build镜像并启动container
docker-compose up -d
# 重新构建
docker-compose build
# 运行前重新构建
docker-compose up -d --build
Docker hub
# 先注册账号
# 登陆
docker login
# 搜索
docker search apache
# tag
docker tag my_tomcat:0.0.1 liuyuheng/tomcat:8.5.5
# push
docker push liuyuheng/tomcat:8.5.5
# logout
docker logout
dockerhub 上可以看到新 push 的 image