測試開發進階(四十四)

運行一個頁面

index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>「測試遊記」</title>
</head>
<body>
    <h1>「測試遊記」</h1>
</body>
</html>

運行nginx

$ docker run --name my_web -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6688:80 nginx:alpine

查看Docker網絡信息

$ docker inspect my_web
"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "df9d31e0e839edd40d10b32b0459fc178efc4a7d22ee9d06090e7c47dd135bfc",
        "EndpointID": "c905dc6442971d9e6a2b36581f7081b0bf976aec477fe01dd0596cbed7647de0",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:02",
        "DriverOpts": null
    }
}
$ docker exec -it my_web ip a
inet 127.0.0.1/8 scope host lo
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

network

docker0

默認容器與宿主機之間溝通的橋樑

網絡類型

  • bridge(默認)

nat網絡模型,虛擬路由器

  • host

與宿主機共享網絡 --net=host

  • none

不配置網絡 --net=none

  • overlay

不同網絡進行通信

與一同容器共享網絡 --net=container:容器名

查看docker網絡列表

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
df9d31e0e839        bridge              bridge              local
b58ef02d2c13        host                host                local
544544bfb357        none                null                local

創建一個網絡

$ docker network create my_net

在該網絡下創建兩個容器

$ docker run --name my_web1 --network my_net -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine
$ docker run --name my_web2 --network my_net -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6690:80 nginx:alpine

查看當前創建的網絡

$ docker network inspect my_net

可以發現

  • my_web1的網絡地址爲 172.18.0.2/16

  • my_web2的網絡地址爲 172.18.0.3/16

測試一下兩者是否相通

$ docker exec -it my_web1 ping -c2 172.18.0.3
$ docker exec -it my_web2 ping -c2 172.18.0.2
# 還可以通過容器名訪問
$ docker exec -it my_web2 ping -c2 my_web1
$ docker exec -it my_web1 ping -c2 my_web2

使用host

與宿主機網絡完全一致

$ docker run --name my_web3 --network host -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine
$ docker exec -it my_web3 ip a

使用none

$ docker run --name my_web4 --network none -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine
$ docker exec -it my_web4 ip a

批量刪除my_web

$ docker rm -f $(docker ps|awk '/my_web/ {print $1}')

批量刪除Exited的內容

$ docker rm -f $(docker ps -a|awk '/Exited/ {print $1}')

volume

  • 使用數據卷實現數據持久化

  • 數據備份/數據共享

搭建一個個人博客

運行mysql

-e環境變量

-d後臺執行

$ docker run --name mydb --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

運行wordpress

$ docker run --name myblog --network my_net -d -e WORDPRESS_DB_HOST=mydb -e WORDPRESS_DB_PASSWORD=123456 -p 6688:80 wordpress

創建數據卷

$ docker volume create myvol

與數據庫映射

$ docker run --name mydb --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d -v myvol:/var/lib/mysql mysql:5.7

mysql產生的數據會自動同步到數據卷

這樣刪除 mydb也可以恢復數據

查看數據卷

$ docker volume inspect myvol
[
    {
        "CreatedAt": "2019-12-05T16:24:37Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvol/_data",
        "Name": "myvol",
        "Options": {},
        "Scope": "local"
    }
]

使用管理員賬號進入 /var/lib/docker/volumes/myvol/_data可以查看存儲的數據

刪除數據卷

$ docker volume rm myvol

Dockerfile

fun.py

from cowpy import cow
print(cow.milk_random_cow("Hello,Everyone"))

requirements.txt

cowpy==1.1.0

Dockerfile

FROM python:alpine
LABEL maintainer="zhongxin <[email protected]>"
LABEL description="This is simple example."
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python","fun.py"]

創建

$ docker build ./ -t animal

使用

$ docker run --name animal --rm animal

關鍵字

  • 使用 FROM來指定base image鏡像(在base image的基礎上來操作),放在首行

  • LABEL指明作者,不執行的指令

  • WORKDIR相當於 cd命令,如果進入的目錄不存在,會創建

  • COPY相當於 cp命令,宿主機中的內容「前」 複製到 容器中「後」

  • ./爲當前目錄 WORKDIR

  • ADDCOPY命令類似,他會將一個壓縮文件解壓後,複製到容器中

  • RUN在容器中執行linux命令需要使用RUN

  • 可以執行多個 RUN

  • COPY..把相對於Dockerfile文件所在路徑的所有文件拷貝到容器的當前目錄

  • CMD當鏡像運行的時候會默認執行的命令

RUN

在已存在的image頂層執行命令,創建一個新的layer層

往往將需要安裝的依賴,使用一個RUN來創建。多個命令可以用 &&來拼接

ENV

在容器內創建環境變量

ENV username=zhongxin \
        password=123456

VOLUME

VOLUME命令指定的目錄「容器中」才能被映射

EXPOSE

將容器中的端口暴露出來

ENTRYPOINT 和 CMD

不同點

CMD

  • 運行容器時,不加任何參數,會自動執行CMD,如果添加參數會忽略CMD

  • 有多個CMD,則只有最後一個會執行,其他都被忽略

  • 可以給ENTRYPOINT傳參

CMD["p1","p2"]

如果ENTRYPOINT使用shell格式,CMO會被忽略

如果ENTRYPOINT使用exec格式,CMO會和它進行組合

ENTRYPOINT

  • 運行容器時,如果添加參數不會忽略ENTRYPOINT

相同點

  • 只有1個CMD或者ENTRYPOINT時,沒有區別

  • shell格式和exec格式

shell格式:ls /

exec格式:["ls","/"]

一定要「雙引號」

CMD和ENTRYPOINT一起使用的時候,

  • 不入參爲ENTRYPOINT+CMD

  • 入參爲爲ENTRYPOINT+參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章