安裝docker
去官網(wǎng)上下載對(duì)應(yīng)的
第一次使用
- 查看版本
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
- 查看docker信息
$ docker info
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 2
Server Version: 18.06.1-ce
...
- hello world
運(yùn)行 hello-world 鏡像,如果沒(méi)有則下載并運(yùn)行
$ docker run hello-world
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
- 查看鏡像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 7 weeks ago 1.84kB
- 查看容器
如果容器還在運(yùn)行,就不需要--all
參數(shù)
$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2479723dcd4 hello-world "/hello" 4 hours ago Exited (0) 4 hours ago hardcore_cori
通過(guò)Dockerfile 來(lái)定義容器
Dockerfile
創(chuàng)建一個(gè)目錄,在此目錄下新建一個(gè)Dockerfile文件
# 將官方 Python 運(yùn)行時(shí)用作父鏡像
FROM python:2.7-slim
# 將工作目錄設(shè)置為 /app
WORKDIR /app
# 將當(dāng)前目錄內(nèi)容復(fù)制到位于 /app 中的容器中
ADD . /app
# 安裝 requirements.txt 中指定的任何所需軟件包
RUN pip install -r requirements.txt
# 使端口 80 可供此容器外的環(huán)境使用
EXPOSE 80
# 定義環(huán)境變量
ENV NAME World
# 在容器啟動(dòng)時(shí)運(yùn)行 app.py
CMD ["python", "app.py"]
其中涉及應(yīng)用的文件還未創(chuàng)建
應(yīng)用文件
- requirements.txt
Flask
Redis
- app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
構(gòu)建應(yīng)用
- 查看應(yīng)用目錄
$ ls
Dockerfile app.py requirements.txt
- 運(yùn)行構(gòu)建命令祸泪,創(chuàng)建Docker鏡像,使用
-t
對(duì)鏡像起別名
$ docker build -t friendlyhello
- 查看構(gòu)建好的鏡像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest 4e3e33fac3e2 21 minutes ago 131MB
python 2.7-slim 99079b24ed51 7 days ago 120MB
hello-world latest fce289e99eb9 7 weeks ago 1.84kB
運(yùn)行應(yīng)用
正常模式
- 運(yùn)行應(yīng)用,使用
-p
將本機(jī)的4000端口映射到容器向外暴露的80端口
$ docker run -p 4000:80 friendlyhello
- 瀏覽器訪問(wèn) http://localhost:4000或者使用
curl
$ curl http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> 65c750525420<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
- 終止應(yīng)用
CTRL+C
分離模式
- 通過(guò)
-d
將docker啟動(dòng)的應(yīng)用在后臺(tái)運(yùn)行
$ docker run -d -p 4000:80 friendlyhello
63463f542b5c6dd2aa2840a1798272d4934982b3fdc2277befe5c6221e9a6c4d
返回的是應(yīng)用的容器完整ID
- 查看應(yīng)用
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bfc58a8896a friendlyhello "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:4001->80/tcp heuristic_galileo
CONTAINER ID
與 頁(yè)面上顯示的Hostname值一致
- 終止應(yīng)用
docker stop
根據(jù) CONTAINER ID
去終止應(yīng)用
$ docker stop 7bfc58a8896a
將應(yīng)用推送到鏡像庫(kù)
- 本機(jī)登錄
docker login
- 標(biāo)記鏡像
docker tag image username/repository:tag
$ docker tag friendlyhello zsq/hello-world:first
- 查看標(biāo)記鏡像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest 4e3e33fac3e2 2 hours ago 131MB
zsq/hello-world first 4e3e33fac3e2 2 hours ago 131MB
python 2.7-slim 99079b24ed51 7 days ago 120MB
hello-world latest fce289e99eb9 7 weeks ago 1.84kB
...
4.發(fā)布鏡像
$ docker push zsq/hello-world:first
- 從遠(yuǎn)程鏡像庫(kù)拉取到本地并運(yùn)行鏡像
如果存在直接運(yùn)行饰序,否則將從遠(yuǎn)程拉取并運(yùn)行
$ docker run -p 4000:80 zsq/hello-world:first
相關(guān)命令
docker build -t friendlyname .# 使用此目錄的 Dockerfile 創(chuàng)建鏡像
docker run -p 4000:80 friendlyname # 運(yùn)行端口 4000 到 90 的“友好名稱(chēng)”映射
docker run -d -p 4000:80 friendlyname # 內(nèi)容相同,但在分離模式下
docker ps # 查看所有正在運(yùn)行的容器的列表
docker stop <hash> # 平穩(wěn)地停止指定的容器
docker ps -a # 查看所有容器的列表规哪,甚至包含未運(yùn)行的容器
docker kill <hash> # 強(qiáng)制關(guān)閉指定的容器
docker rm <hash> # 從此機(jī)器中刪除指定的容器
docker rm $(docker ps -a -q) # 從此機(jī)器中刪除所有容器
docker images -a # 顯示此機(jī)器上的所有鏡像
docker rmi <imagename> # 從此機(jī)器中刪除指定的鏡像
docker rmi $(docker images -q) # 從此機(jī)器中刪除所有鏡像
docker login # 使用您的 Docker 憑證登錄此 CLI 會(huì)話
docker tag <image> username/repository:tag # 標(biāo)記 <image> 以上傳到鏡像庫(kù)
docker push username/repository:tag # 將已標(biāo)記的鏡像上傳到鏡像庫(kù)
docker run username/repository:tag # 運(yùn)行鏡像庫(kù)中的鏡像
服務(wù)
服務(wù)是“生產(chǎn)中的容器”求豫,一般一項(xiàng)服務(wù)僅運(yùn)行一個(gè)鏡像,但是可以對(duì)該鏡像啟用負(fù)載均衡
docker-compose.yml
定義诉稍、運(yùn)行和擴(kuò)展docker蝠嘉,也就是定義Docker容器在生產(chǎn)環(huán)境中的行為
version: "3"
services:
web:
# 將 username/repo:tag 替換為您的名稱(chēng)和鏡像詳細(xì)信息
image: username/repository:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
- 將 Compose 文件設(shè)置為 version:"3"。本質(zhì)上杯巨,這會(huì)使其兼容 swarm mode蚤告。
- 從鏡像庫(kù)中拉取指定鏡像。
- 將鏡像分為5個(gè)web運(yùn)行服爷,每個(gè)實(shí)例限制最多使用10%的CPU和50MB的RAM杜恰。
- 如果某個(gè)容器發(fā)生錯(cuò)誤,立即重啟容器仍源。
- 將主機(jī)上的4000端口映射到docker(web)的80端口心褐。
- 使用默認(rèn)設(shè)置定義webnet網(wǎng)絡(luò)(此為負(fù)載均衡的overlay網(wǎng)絡(luò))
運(yùn)行服務(wù)
- 開(kāi)啟swarm管理節(jié)點(diǎn)
$ docker swarm init
如果沒(méi)有執(zhí)行過(guò)docker swarm init
,將報(bào)this node is not a swarm manager
- 運(yùn)行應(yīng)用
$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
getstartedlab為服務(wù)的別名
- 查看服務(wù)中容器的列表
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kpdbgnl2p7yb getstartedlab_web.1 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
k6uqshqqfxkz getstartedlab_web.2 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
vfn8ys8cpkc3 getstartedlab_web.3 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
4wtvs8qqxnul getstartedlab_web.4 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
bb2w7co8x3br getstartedlab_web.5 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
此時(shí)笼踩,web應(yīng)用已經(jīng)實(shí)現(xiàn)負(fù)載均衡了逗爹,通過(guò)http://localhost:4000可以看到每次刷新后容器ID都會(huì)發(fā)生改變,每次請(qǐng)求嚎于,將以循環(huán)方式選擇5個(gè)從節(jié)點(diǎn)之一做出響應(yīng)
- 查看服務(wù)
$ docker stack services getstartedlab
ID NAME MODE REPLICAS IMAGE PORTS
tc12dkx8copc getstartedlab_web replicated 5/5 zsq/one:1 *:4001->80/tcp
- 擴(kuò)展服務(wù)
可以將docker-compose.yml
中的replicas值改為2掘而,重新運(yùn)行docker stack deploy
命令來(lái)擴(kuò)展,無(wú)需事先清除技術(shù)椮倚瘢或者終止容器
$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web (id: tc12dkx8copcgy09dmng5h7z7)
再次查看容器列表镣屹,可以看到已經(jīng)移除了3個(gè)
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
nhyp01413tb9 getstartedlab_web.1 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
1zwklq2rbkpo getstartedlab_web.2 zsq/one:1 linuxkit-025000000001 Running Running about a minute ago
42xx8qkib6hh getstartedlab_web.3 zsq/one:1 linuxkit-025000000001 Remove Running 14 seconds ago
jkua7sao1m6g getstartedlab_web.4 zsq/one:1 linuxkit-025000000001 Remove Running 14 seconds ago
8r39nv3q7dyb getstartedlab_web.5 zsq/one:1 linuxkit-025000000001 Remove Running 14 seconds ago
- 清除服務(wù)應(yīng)用
$ docker stack rm getstartedlab
Removing service getstartedlab_web
Removing network getstartedlab_webnet
但是單節(jié)點(diǎn)swarm仍在運(yùn)行
- 清除swarm
先查看下,是否在運(yùn)行
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
89zkmhm6eqgjsigjzr71q4661 * linuxkit-025000000001 Ready Active Leader 18.06.1-ce
清除swarm
$ docker swarm leave --force
Node left the swarm.
相關(guān)命令
docker stack ls # 列出此 Docker 主機(jī)上所有正在運(yùn)行的應(yīng)用
docker stack deploy -c <composefile> <appname> # 運(yùn)行指定的 Compose 文件
docker stack services <appname> # 列出與應(yīng)用關(guān)聯(lián)的服務(wù)
docker stack ps <appname> # 列出與應(yīng)用關(guān)聯(lián)的正在運(yùn)行的容器
docker stack rm <appname> # 清除應(yīng)用