Docker教程 - 包括Volume, Network, docker-compose, dockerhub

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

runoob

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. 中央仓库

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
image-20200704231637229

inspect

docker volume inspect my_data
image-20200704231805336

绑定

卷名:容器内部路径

# 数据卷不存在时,会自动创建。
# 容器内文件会同步到宿主机目录
docker run -v 卷名:容器内部路径 image_id
image-20200705000218955

路径:容器内部路径

# 不会创建卷
# 文件不会同步到宿主机
# 推荐使用
image-20200705000645324

6. Network

none

--network none

默认 bridge

container 之间互通

实验

安装工具包,后面brctl命令要使用

sudo yum install bridge-utils

没有任何容器时,仅有默认 docker0 bridge

image-20200705084154896

启动 2 个容器

docker run --name demo1 --rm -it busybox /bin/sh
docker run --name demo2 --rm -it busybox /bin/sh

可以看到 interface 都在 docker0 内

image-20200705084357535

ifconfig 也可以看到多了 2 个网络

image-20200705110914907

ip addr show可以看到 interface 编号,与容器内部编号一起可确定使用的是哪个

image-20200705111449012
image-20200705111621996

自定义网络

  • 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

image-20200705170803654
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343