1. 構建你的Docker環(huán)境(最復雜的問題要用最簡單的方式來解決)
Docker是一個對于開發(fā)者和系統(tǒng)管理員用容器去開發(fā)稽穆,部署和運行應用程序的一個平臺。
-
Docker非常流行的幾個因素
- Flexible(靈活的)
- Lightweight(輕量級的)
- Interchangeable(可互換的赶撰,可交替的)
- Portable(便攜的)
- Scalable(可擴展的)
- Stackable(易疊起堆放的舌镶;可疊起堆放的)
-
鏡像和容器
- 鏡像
A container is launched by running an image.鏡像就是一個可執(zhí)行的包柱彻,這個包中有程序運行的所有條件,代碼餐胀,依賴的jar包哟楷,環(huán)境變量,配置文件否灾。 - 容器
容器是一個運行的鏡像實例吓蘑。你可以使用命令docker ps
去查看正在運行的容器。 -
容器和虛擬機的差別
- 較虛擬機而言坟冲,Docker將會更加省內(nèi)存基于上圖。因為虛擬機是邏輯上的一臺機器溃蔫,它共享宿主機器的硬件資源健提。
- 鏡像
-
Docker的Cli命令簡介
[root~]# docker Usage: docker COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/root/.docker") -D, --debug Enable debug mode -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") --tlskey string Path to TLS key file (default "/root/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Management Commands: config Manage Docker configs container Manage containers image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes Commands: attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes Run 'docker COMMAND --help' for more information on a command.
小結
以上是通過運行docker
打印出來的所有有關docker
的命令。如果想了解具體某部分的命令伟叛,比如私痹,我現(xiàn)在想了解鏡像相關的命令,可以輸入docker image
,這樣在命令行中就會輸出與鏡像相關的命令统刮。如果對于某個命令有疑問紊遵,可以使用docker image build --help
進行命令的查詢,在Linux世界中侥蒙,對于不會的命令暗膜,或第一次遇到的命令,可以找man
鞭衩,在Docker中就可以找help
了学搜,一切help
。
-
Docker的版本等相關命令
#查看Docker的版本 docker --version Docker version 18.03.1-ce, build 9ee9f40 #查看跟多的信息 docker version Client: Version: 18.03.1-ce API version: 1.37 Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:20:16 2018 OS/Arch: linux/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.03.1-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:23:58 2018 OS/Arch: linux/amd64 Experimental: false #查看Docker一些詳細信息 docker info Containers: 3 Running: 0 Paused: 0 Stopped: 3 Images: 2 Server Version: 18.03.1-ce Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88 runc version: 4fc53a81fb7c994640722ac585fa9ca548971871 init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 3.10.0-693.2.2.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 992.3MiB Name: iz2ze6jeqopgq9yoosls6dz ID:UIVR:2YDB:XRFJ:PUFM:WFJH:NZVN:LCSM:W7AI:BNLA:RBED:T7RJ:I22F Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false #Docker hello world docker run hello-world #列出下載到本機上的所有鏡像文件 docker image ls #遇到不會的命令怎么辦呢论衍? docker container --help
2. 構建一個鏡像并且作為容器運行
方便攜帶的鏡像是由一個叫做
Dockerfile
這個文件定義的瑞佩。-
創(chuàng)建一個
Dockerfile
文件首先創(chuàng)建一個路徑
containers
cd
進入這個路徑cd containers
-
創(chuàng)建一個
Dockerfile
文件# Use an official Python runtime as a parent image # 從python:2.7-slim這個鏡像基礎之上創(chuàng)建的鏡像, FROM命令可以多次使用 FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"]
-
Docker提供一種自動化的方式來創(chuàng)建鏡像--
Dockerfile
坯台。Dockerfile
包含了創(chuàng)建鏡像所需要的全部命令炬丸。Docker支持如下語法命令:# 指令要大寫根據(jù)命名規(guī)約 INSTRUCTION argument
-
有趣的
Dockerfile命令
-
FROM
:基于某個鏡像去構建FROM ubuntu //基于ubuntu的鏡像來構建。
-
MAINTAINER
:鏡像的維護者MAINTAINER mark // 鏡像的作者mark
-
RUN
:在Shell或exec環(huán)境下執(zhí)行命令蜒蕾。這個命令會在新創(chuàng)建的鏡像上添加新的層面(layer), RUN指令會在shell里使用命令包裝器/bin/sh -c
來執(zhí)行稠炬。RUN pip install --trusted-host pypi.python.org -r requirements.txt
-
ADD
:復制文件指令。有兩個參數(shù)src和destinction咪啡。destinction是容器內(nèi)的路徑酸纲。src是URL或啟動配置上下文的一個文件。ADD . /app
-
CMD
:提供容器默認的執(zhí)行命令瑟匆。只允許使用一次闽坡。CMD ["python", "app.py"]
-
EXPOSE
:暴露容器在Docker虛擬機內(nèi)部運行時的監(jiān)聽端口栽惶。EXPOSE 8080
-
ENTRYPOINT
:配置給容器一個可執(zhí)行的命令。這意味著在每次使用鏡像創(chuàng)建一個容器時一個特定的應用程序可以被設置成默認程序疾嗅。同時也意味著該鏡像被調用時只能運行指定的程序外厂。類似CMD
,只允許一個ENTRYPOINT
,如果多個出現(xiàn),以最后一個命令為準代承。ENTRYPOINT ['executable', 'param1', 'param2']
-
WORKDIR
:指命令RUN
,CMD
和ENTRYPOINT
的工作目錄汁蝶。WORKDIR /app
-
ENV
:設置環(huán)境變量,使用key-value
的方式ENV NAME World
-
USER
:鏡像運行時設置一個UID.USER mark
-
VOLUME
:授權訪問容器內(nèi)到主機上的目錄论悴。VOLUME ['/data']
-
-
在同一路徑下創(chuàng)建另外兩個文件掖棉,
requirements.txt
和app.py
。-
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)
-
-
構建應用
docker build -t friendlyhello .
查看本地鏡像文件
docker image ls
-
運行自己制作的docker鏡像
docker run friendlyhello
/docker run -p 4000:80 friendlyhello
運行結果如圖所示
將鏡像起個別名膀估,準備上傳到Docker Hub上
docker tag friendlyhello gordon/get-started:part2
docker push username/repository:tag
-
本小節(jié)常用的命令
docker build -t friendlyhello . # Create image using this directory's Dockerfile docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80 docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode docker container ls # List all running containers docker container ls -a # List all containers, even those not running docker container stop <hash> # Gracefully stop the specified container docker container kill <hash> # Force shutdown of the specified container docker container rm <hash> # Remove specified container from this machine docker container rm $(docker container ls -a -q) # Remove all containers docker image ls -a # List all images on this machine docker image rm <image id> # Remove specified image from this machine docker image rm $(docker image ls -a -q) # Remove all images from this machine docker login # Log in this CLI session using your Docker credentials docker tag <image> username/repository:tag # Tag <image> for upload to registry docker push username/repository:tag # Upload tagged image to registry docker run username/repository:tag # Run image from a registry
3. 擴展您的應用程序以運行多個容器
拆分應用并實現(xiàn)負載均衡幔亥,我們必須在分布式應用程序的層次結構中提升一個級別:服務。
在分布式應用中, 會根據(jù)不同的業(yè)務劃分不同的模塊察纯,實現(xiàn)不同的功能帕棉。拆分服務比較容易,通過寫
docker-compose.yml
文件來實現(xiàn)饼记。docker-compose.yml
是一個YAML文件香伴,定義了Docker容器在生產(chǎn)中的表現(xiàn)。-
docker-compose.yml
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet:
-
這個文件告訴Docker要做下面的事情具则。
- 在Docker Hub上面拉取鏡像
- 運行5個從Docker Hub上面下載下來的鏡像實例作為一個web服務即纲。限制每個都要被用到,最多10%的CPU資源和50M的內(nèi)存資源博肋。
- 如果一個停止或者
fail
掉的話崇裁,立即重新啟動。 - 通過主機上的
4000
端口和Docker中容器container
進行綁定束昵。 - 通知
web
容器共享端口80
通過負載均衡網(wǎng)絡被稱為webnet
拔稳。 - 用默認的方式定義
webnet
網(wǎng)絡(負載均衡的覆蓋網(wǎng)絡)。
-
運行負載均衡
app
- 第一步首先運行
docker swarm init
- 第二步運行
docker stack deploy -c docker-compose.yml getstartedlab
- 第三步
docker service ls
- 第四步
docker service ps helloworld_web
- 第五步
docker container ls -q
- 第六步
curl http://localhost:4000
- 第一步首先運行
擴展你的應用
通過修改docker-compose.yml
文件中replicas
值來擴展你的應用锹雏,然后運行命令docker stack deploy -c docker-compose.yml getstartedlab
4. 在群集中分發(fā)您的應用
你部署一個應用到一個集群巴比,在多臺機器上運行。多容器礁遵,多機器的應用通過加入更多的機器來進行
Dockerized
集群的制作轻绞,被稱為Swarm
。一個
swarm
是一群運行在Docker
上機器成為一個集群佣耐。一個swarm
開始后政勃,你可以運行你熟悉的Docker命令。但他們現(xiàn)在被一個swarm manager
在一個集群上執(zhí)行兼砖。在swarm
中的機器可以是物理機器也可以是虛擬機奸远。加入swarm
后既棺,他們被稱為節(jié)點。-
swarm manager
運行集群的兩種策略:emptiest node
global
swarm manager
是唯一一臺可以執(zhí)行命令懒叛,授權其他機器一worker
的角色加入swarm
丸冕。worker
僅僅可以提供容量并且沒有權限告訴其他機器,他們能做或不能做什么薛窥。直到現(xiàn)在胖烛,你一直用你的Docker以單主機的模式在本地運行。Docker也可以切換到
swarm mode
模式诅迷。-
建立你的
swarm
- 一個
swarm
有多個節(jié)點構成佩番。節(jié)點可以是物理節(jié)點,也可以是虛擬節(jié)點罢杉√宋罚可以使用命令docker swarm init
開啟swarm
模式并且是自己的機器成為swarm manager
。然后運行命令docker swarm join
在其他的機器上屑那,使其加入swarm成為worker
。現(xiàn)在我們使用虛擬機創(chuàng)建兩臺機器的集群艘款,然后創(chuàng)建好的兩臺機器添加到swarm中持际。虛擬機可以使用win10的Hyper-v
或者使用VirtualBox來搭建。在使用Docker Toolbox前哗咆,一定要保證VirtualBox已經(jīng)安裝了蜘欲。
- 一個
-
現(xiàn)在用命令
docker-machine
和VirtualBox driver
來創(chuàng)建一對虛擬機。docker-machine create --driver virtualbox myvm1 docker-machine create --driver virtualbox myvm2
列出虛擬機并且得到他們的IP地址晌柬,使用命令
docker-machine ls
姥份。