目錄html
https://docs.docker.com/install/ https://docs.docker.com/install/linux/docker-ce/centos/
二進制方式安裝
java
https://docs.docker.com/install/linux/docker-ce/binaries/
mac安裝
node
https://docs.docker.com/docker-for-mac/install/
windows10 安裝
python
https://docs.docker.com/docker-for-windows/install/
什麼是image
什麼是layer
搜索下載鏡像
鏡像打標籤,使用標籤mysql
image = files + metadatalinux
files
文件是構建容器的根文件系統
metadata
包含一些元數據信息nginx
images由一層層的files相互堆疊起來, 每一層均可以添加/修改/文件;元數據信息, 鏡像層級共享能夠節省空間,內存,網絡傳輸消耗等.golang
例子: 一個java webapp鏡像各個鏡像層信息
web
鏡像是一個只讀的文件
容器是在該文件系統的讀寫副本中運行的一組封裝的進程。
爲了優化容器啓動時間,使用寫時拷貝而不是常規拷貝。
docker run從給定的image啓動容器。redis
鏡像容器與面向對象中概念
鏡像是隻讀的,若是咱們須要對鏡像進行修改以適應本身需求,咱們沒法修改原有鏡像!
可是咱們能夠基於此鏡像進行修改生成新的鏡像,而新的鏡像是經過舊的鏡像基礎修改而來
建立鏡像
首先得有一個容器
, 而建立一個容器
必須得先有鏡像
,死循環!
解決方法
建立一個基礎的鏡像
,生成新的的鏡像後,再封裝成咱們所須要的鏡像
https://docs.docker.com/samples/library/scratch/ https://docs.docker.com/develop/develop-images/baseimages/
也可使用 docker import
命令導入tarball
壓縮的docker鏡像
生成新的鏡像有兩種方法
docker commit
基於現存容器生成一個新的鏡像(不多使用此方法)
$ docker commit aae5ef258c76 zrd/flanneld:v1 sha256:f46a5c369b4f938a5e2b9498813227f5174b54d6601f76d3a2da1eec6367e4f3
docker build
(99%狀況下使用此方法)
咱們拉取鏡像時有如下幾種方式
docker pull centos
docker pull zhourudong/myweb
docker pull registry.example.com:5000/my-private/image
root namespaces通常由官方建立維護好比咱們所用的鏡像CentOS, mysql
User namespace通常由用戶基於root namespaces
自創的鏡像例如cucy/busybox
,其中cucy
是用戶名,busybox
爲鏡像
Self-hosted namespace此命名空間保存的圖像不在Docker Hub上,而是在第三方自定義, 例如
quay.io/coreos/etcd gcr.io/google-containers/hugo localhost:5000/wordpress
quay.io, gcr.io, localhost:5000
是倉庫的地址,etcd,hugo,wordpress
是鏡像
保存鏡像的方法:
本機 Remote Docker registry
咱們可使用docker client下載(pull),上傳(push)鏡像,嚴格來講是docker client給docker engine發送pull, post請求,由docker
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zrd/flanneld v1 f46a5c369b4f About an hour ago 52.6MB findsec/hello v2 72f0edcf0c06 4 days ago 941MB findsec/hello v1 c54843059b2b 4 days ago 941MB calico/node v3.8.0 cd3efa20ff37 10 days ago 155MB calico/cni v3.8.0 539ca36a4c13 10 days ago 143MB calico/kube-controllers v3.8.0 df5ff96cd966 10 days ago 46.8MB calico/pod2daemon-flexvol v3.8.0 f68c8f870a03 13 days ago 9.37MB gcr.azk8s.cn/google-containers/kube-proxy v1.15.0 d235b23c3570 3 weeks ago 82.4MB
# docker search busybox NAME DESCRIPTION STARS OFFICIAL AUTOMATED busybox Busybox base image. 1623 [OK] progrium/busybox 70 [OK] radial/busyboxplus Full-chain, Internet enabled, busybox made f… 24 [OK] arm32v7/busybox Busybox base image. 7 yauritux/busybox-curl Busybox with CURL 5 armhf/busybox Busybox base image. 4 arm64v8/busybox Busybox base image. 3
OFFICIAL
表示是官方鏡像
AUTOMATED
自動構建
docker pull指定下載鏡像
docker run當本地沒有此鏡像時,會到docker倉庫進行拉取
docker tag busybox:latest zrd:prod-v1
適合使用標籤場景
快速測試使用 正在開發環境調式 使用latest版本
適合打標籤場景
在腳本中定義版本信息 生產環境 重複使用
docker commit, docker tag, and docker diff
等命令主機上執行 # docker run -it centos 容器內運行 [root@1e42384795b3 /]# yum install wget -y && rm -rf /var/cache/yum 容器所修改的內容 [root@k8s-master-45 ~]# docker diff fb62137afd63 C /usr C /usr/bin A /usr/bin/wget C /usr/share C /usr/share/locale C /usr/share/locale/en_GB C /usr/share/locale/en_GB/LC_MESSAGES A /usr/share/locale/en_GB/LC_MESSAGES/wget.mo 主機上執行 $ docker commit <yourContainerId> # docker commit fb62137afd63 zrd/centostest
鏡像是隻讀,當咱們對其進行修改時,它會拷貝修改的文件到新的鏡像, , 基於性能出發點,docker使用copy-on-write技術
驗證生成的鏡像
# docker run zrd/centostest wget baidu.com --2019-07-12 09:44:48-- http://baidu.com/ Resolving baidu.com (baidu.com)... 123.125.114.144, 220.181.38.148 Connecting to baidu.com (baidu.com)|123.125.114.144|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 81 [text/html] Saving to: 'index.html' 0K 100% 12.9M=0s 2019-07-12 09:44:48 (12.9 MB/s) - 'index.html' saved [81/81]
打標籤
兩種打標籤方法
$ docker tag <newImageId> figlet $ docker commit <containerId> figlet
以上構建鏡像方法過於繁雜, Dockerfile應運而生
$ vim Dockerfile
FROM ubuntu RUN apt-get update RUN apt-get install figlet
FROM 指定從哪一個基礎鏡像開始構建
RUN 每個RUN指令就是構建一個鏡像, RUN 運行的命令不能有交互
$ docker build -t figlet .
-t 表示指定標籤
. 表示以當前目錄下Dockerfile
中所定義的步驟進行構建鏡像
構建時,顯示的內容
[root@k8s-master-45 ~/myimage]# docker build -t figlet . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu ---> 4c108a37151f Step 2/3 : RUN apt-get update ---> Running in 6c0d73559f78 Removing intermediate container 5e624609a7f1 ---> 81def0f272fc Successfully built 81def0f272fc Successfully tagged figlet:latest
context
Sending build context to Docker daemon 2.048kB
由於docker client 和Docker daemon(Engine)能夠在不一樣的主機上,在構建時,docker client 須要將本地數據上傳給docker daemo(壓縮); 在構建時若是docker client 和docker engine不在同一臺主機上時,上傳本地文件數據會耗費很長的時間
docker build --no-cache
docker history figlet
CMD / ENTRYPOINT
這兩個命令能夠設置容器啓動時容器運行的命令參數
CMD
FROM ubuntu RUN apt-get update RUN ["apt-get", "install", "figlet"] CMD figlet -f script hello
不加指定參數默認以CMD定義的命令來運行
[root@k8s-master-45 ~/myimage]# docker run figlet _ _ _ | | | | | | | | _ | | | | __ |/ \ |/ |/ |/ / \_ | |_/|__/|__/|__/\__/
覆蓋
CMD
默認設定的命令
$ docker run -it figlet bash root@7ac86a641116:/#
ENTRYPOINT
FROM ubuntu RUN apt-get update RUN ["apt-get", "install", "figlet"] ENTRYPOINT ["figlet", "-f", "script"]
運行測試
$ docker run figlet salut _ | | , __, | | _|_ / \_/ | |/ | | | \/ \_/|_/|__/ \_/|_/|_/
使用 CMD 仍是 ENTRYPOINT?
兩個能夠同時並存, ENTRYPOINT
做爲基本執行命令不會被覆蓋,若是使用CMD
命令會被所有覆蓋;因此ENTRYPOINT
做爲容器的基本命令,而CMD
定義爲默認的參數
FROM ubuntu RUN apt-get update RUN ["apt-get", "install", "figlet"] ENTRYPOINT ["figlet", "-f", "script"] CMD ["hello world"]
以上例子,當容器運行後,若是不給參數則命令 CMD
是默認的參數; 若是啓動時給定參數,CMD
設置的參數會被覆蓋.
# docker build -t figlet . Sending build context to Docker daemon 2.048kB Step 1/5 : FROM ubuntu .... 以默認參數運行 # docker run figlet _ _ _ _ | | | | | | | | | | | _ | | | | __ __ ,_ | | __| |/ \ |/ |/ |/ / \_ | | |_/ \_/ | |/ / | | |_/|__/|__/|__/\__/ \/ \/ \__/ |_/|__/\_/|_/ 覆蓋默認參數 # docker run figlet 123 , __ ___ /|/ )/ \ | / __/ | / \ |/___\___/
強制覆蓋ENTRYPOINT
咱們可使用--entrypoint
覆蓋基本命令
$ docker run -it --entrypoint bash figlet root@6027e44e2955:/#
時候構建代碼時,代碼並不在容器中(在宿主機上), 咱們須要使用COPY 或者ADD命令將本地文件拷貝到容器中
代碼內容以下
# cat hellogo.go package main func main() { println("Hi, golang!") }
Dockerfile
FROM ubuntu RUN apt-get update RUN apt-get install -y golang COPY hellogo.go / RUN GOPATH=/ && go build -o hellogo . CMD /hellogo
CPOY /ADD相似,
ADD
能夠解壓壓縮文件(展開壓縮文件的內容,而不是把整個壓縮包往容器裏添加)
以最小依賴來安裝軟件包, 構建完成前能夠清理一些緩存,好比apt yum 的cache目錄
docker image build --squash ...
壓縮成單一層鏡像
FROM ubuntu AS compiler RUN apt-get update RUN apt-get install -y golang COPY hellogo.go / RUN GOPATH=/ && go build -o hellogo . FROM ubuntu COPY --from=compiler hellogo.go / CMD /hellogo
docker login # 登陸信息會保存在 ~/.docker/config docker target image someimage zrd/someimage docker push zrd/someimage
#!/bin/sh set -e # first arg is '-f' or '--some-option' # or first arg is 'something.conf' if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then set -- redis-server "$@" fi # allow the container to be started with '--user' if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then chown -R redis . exec su-exec redis "$0" "$@" fi exec "$@"
$ docker inspect --format '{{ json .Created }}' <containerID> "2015-02-24T07:21:11.712240394Z"
docker run -d -l owner=alice nginx docker run -d -l owner=bob nginx docker run -d -l owner nginx
$ docker inspect $(docker ps -lq) | grep -A3 Labels "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>", "owner": "" },
$ docker inspect $(docker ps -q) --format 'OWNER={{.Config.Labels.owner}}' $ docker ps --filter label=owner Or we can list containers having a specific label with a specific value. $ docker ps --filter label=owner=alice docker cp <container_id>:/var/log/nginx/error.log . docker run -ti --entrypoint sh debugimage
內存
docker run -ti --memory 100m python
cpu
--cpus 0.1 means 10% of one CPU, --cpus 1.0 means 100% of one whole CPU, --cpus 10.0 means 10 entire CPUs. --cpuset-cpus 0 forces the container to run on CPU 0; --cpuset-cpus 3,5,7 restricts the container to CPUs 3, 5, 7; --cpuset-cpus 0-3,8-11 restricts the container to CPUs 0, 1, 2, 3, 8, 9, 10, 11.
docker run --net none ...
單網絡容器
!()[bridge1.png]
Two containers on a single Docker network
!()[bridge2.png]
Two containers on two Docker networks
!()[bridge3.png]
docker network create dev $ docker run -d --name es --net dev elasticsearch:2 $ docker run -ti --net dev alpine sh $ docker run --net dev --net-alias redis -d redis
--internal --gateway --subnet --ip-range --aux-address $ docker network create --subnet 10.66.0.0/16 pubnet $ docker run --net pubnet --ip 10.66.66.66 -d nginx docker network connect <network> <container> docker network disconnect <network> <container> docker network connect dev <container_id>