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 存儲(chǔ)驅(qū)動(dòng)程序需要 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

# 國(guó)內(nèi)源
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. 中央倉(cāng)庫(kù)

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售睹,則會(huì)報(bào)錯(cuò),需要先執(zhí)行docker rm <container>
docker rmi b8

本地導(dǎo)入導(dǎo)出(不規(guī)范)

# docker save -o /path/to/save image_id一部分
docker save -o tomcat.docker b8

# 導(dǎo)入敬辣,repo和tag會(huì)成為<none>
docker load -i ./tomcat.docker

改名字

# docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag b8 tomcat:8

4. 容器的操作

運(yùn)行 run

# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# -d 后臺(tái)運(yùn)行
# -p 端口映射 Publish a container's port(s) to the host
# --name 指定名字
# --restart=always 隨docker啟動(dòng)
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

進(jìn)入 exec -it

docker exec -it id bash

停止 stop

docker stop id

啟動(dòng) 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. 數(shù)據(jù)卷 Volume

將宿主機(jī)目錄映射到容器內(nèi)部目錄

創(chuàng)建 create

# 默認(rèn)存放路徑 /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

綁定

卷名:容器內(nèi)部路徑

# 數(shù)據(jù)卷不存在時(shí),會(huì)自動(dòng)創(chuàng)建春哨。
# 容器內(nèi)文件會(huì)同步到宿主機(jī)目錄
docker run -v 卷名:容器內(nèi)部路徑 image_id
image-20200705000218955

路徑:容器內(nèi)部路徑

# 不會(huì)創(chuàng)建卷
# 文件不會(huì)同步到宿主機(jī)
# 推薦使用
image-20200705000645324

6. Network

none

--network none

默認(rèn) bridge

container 之間互通

實(shí)驗(yàn)

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

sudo yum install bridge-utils

沒(méi)有任何容器時(shí)恩伺,僅有默認(rèn) docker0 bridge

image-20200705084154896

啟動(dòng) 2 個(gè)容器

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

可以看到 interface 都在 docker0 內(nèi)

image-20200705084357535

ifconfig 也可以看到多了 2 個(gè)網(wǎng)絡(luò)

image-20200705110914907

ip addr show可以看到 interface 編號(hào)赴背,與容器內(nèi)部編號(hào)一起可確定使用的是哪個(gè)

image-20200705111449012
image-20200705111621996

自定義網(wǎng)絡(luò)

  • network 內(nèi)互通

  • 與默認(rèn)和其他 network 不通

  • 通外網(wǎng)

實(shí)驗(yàn)

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 --> 命名規(guī)則 br-<id>,與 network id 對(duì)應(yīng)
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

通過(guò)自動(dòng)添加宿主機(jī) iptables 規(guī)則晶渠,實(shí)現(xiàn) base1 和 base2 隔離凰荚,從 base1 無(wú)法 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

創(chuàng)建 Dockerfile

FROM daocloud.io/library/nginx:latest
RUN echo "Hello nginx!!!!!!!!" > /usr/share/nginx/html/index.html

RUN

用于執(zhí)行后面跟著的命令行命令。有以下倆種格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于番川,在終端操作的 shell 命令到涂。

exec 格式:

RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價(jià)于 RUN ./test.php dev offline

注意:Dockerfile 的指令每執(zhí)行一次都會(huì)在 docker 上新建一層。所以過(guò)多無(wú)意義的層颁督,會(huì)造成鏡像膨脹過(guò)大践啄。例如:

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

以上執(zhí)行會(huì)創(chuàng)建 3 層鏡像〕劣可簡(jiǎn)化為以下格式:

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

如上屿讽,以 && 符號(hào)連接命令,這樣執(zhí)行后吠裆,只會(huì)創(chuàng)建 1 層鏡像伐谈。

COPY

復(fù)制指令,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑试疙。

格式:

COPY [--chown=<user>:<group>] <源路徑1>...  <目標(biāo)路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",...  "<目標(biāo)路徑>"]

[--chown=<user>:<group>]:可選參數(shù)诵棵,用戶改變復(fù)制到容器內(nèi)文件的擁有者和屬組。

<源路徑>:源文件或者源目錄效斑,這里可以是通配符表達(dá)式非春,其通配符規(guī)則要滿足 Go 的 filepath.Match 規(guī)則。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目標(biāo)路徑>:容器內(nèi)的指定路徑缓屠,該路徑不用事先建好奇昙,路徑不存在的話,會(huì)自動(dòng)創(chuàng)建敌完。

ENV

設(shè)置環(huán)境變量储耐,定義了環(huán)境變量,那么在后續(xù)的指令中滨溉,就可以使用這個(gè)環(huán)境變量什湘。

格式:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

以下示例設(shè)置 NODE_VERSION = 7.2.0 长赞, 在后續(xù)的指令中可以通過(guò) $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

聲明端口。

作用:

  • 幫助鏡像使用者理解這個(gè)鏡像服務(wù)的守護(hù)端口闽撤,以方便配置映射得哆。
  • 在運(yùn)行時(shí)使用隨機(jī)端口映射時(shí),也就是 docker run -P 時(shí)哟旗,會(huì)自動(dòng)隨機(jī)映射 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:我的環(huán)境中遇到如下錯(cuò)誤,只能使用 Option 1.

curl: (7) Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; Connection refused

部署并測(cè)試

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運(yùn)行

命令

# 啟動(dòng)
docker-compose up -d

# 開|關(guān)|重啟
docker-compose start|stop|restart

# 查看
docker-compose ps

# 查看日志
docker-compose logs -f

# 關(guān)閉并刪除
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鏡像并啟動(dòng)container
docker-compose up -d

# 重新構(gòu)建
docker-compose build

# 運(yùn)行前重新構(gòu)建
docker-compose up -d --build

Docker hub

# 先注冊(cè)賬號(hào)

# 登陸
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闸餐,一起剝皮案震驚了整個(gè)濱河市饱亮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舍沙,老刑警劉巖近上,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拂铡,居然都是意外死亡壹无,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門感帅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)格遭,“玉大人,你說(shuō)我怎么就攤上這事留瞳【苎福” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵她倘,是天一觀的道長(zhǎng)璧微。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硬梁,這世上最難降的妖魔是什么前硫? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮荧止,結(jié)果婚禮上屹电,老公的妹妹穿的比我還像新娘。我一直安慰自己跃巡,他們只是感情好危号,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著素邪,像睡著了一般外莲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天偷线,我揣著相機(jī)與錄音磨确,去河邊找鬼。 笑死声邦,一個(gè)胖子當(dāng)著我的面吹牛乏奥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亥曹,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼英融,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了歇式?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胡野,失蹤者是張志新(化名)和其女友劉穎材失,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硫豆,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龙巨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熊响。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨别。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汗茄,靈堂內(nèi)的尸體忽然破棺而出秸弛,到底是詐尸還是另有隱情,我是刑警寧澤洪碳,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布递览,位于F島的核電站,受9級(jí)特大地震影響瞳腌,放射性物質(zhì)發(fā)生泄漏绞铃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一嫂侍、第九天 我趴在偏房一處隱蔽的房頂上張望儿捧。 院中可真熱鬧,春花似錦挑宠、人聲如沸菲盾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亿汞。三九已至,卻和暖如春揪阿,著一層夾襖步出監(jiān)牢的瞬間疗我,已是汗流浹背咆畏。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吴裤,地道東北人旧找。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像麦牺,于是被迫代替她去往敵國(guó)和親钮蛛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349