docker基礎

安裝

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

image = files + metadatalinux

files文件是構建容器的根文件系統
metadata包含一些元數據信息nginx

  • 鏡像維護者
  • 啓動時執行的command
  • 設置環境變量

images由一層層的files相互堆疊起來, 每一層均可以添加/修改/文件;元數據信息, 鏡像層級共享能夠節省空間,內存,網絡傳輸消耗等.golang

鏡像容器概念

例子: 一個java webapp鏡像各個鏡像層信息web

  • CentOS base layer
  • 基礎包與配置依賴
  • JRE
  • Tomcat
  • java webapp 運行時jar依賴
  • java webapp 代碼
  • java webapp 配置

容器鏡像區別

鏡像容器對比

鏡像是一個只讀的文件
容器是在該文件系統的讀寫副本中運行的一組封裝的進程。
爲了優化容器啓動時間,使用寫時拷貝而不是常規拷貝。
docker run從給定的image啓動容器。redis

鏡像容器與面向對象中概念

  • image概念上相似類(一些成員屬性數據)
  • layer概念上相似類的繼承
  • 容器相似實例

鏡像基本操做

修改鏡像

鏡像是隻讀的,若是咱們須要對鏡像進行修改以適應本身需求,咱們沒法修改原有鏡像!可是咱們能夠基於此鏡像進行修改生成新的鏡像,而新的鏡像是經過舊的鏡像基礎修改而來

建立鏡像首先得有一個容器, 而建立一個容器必須得先有鏡像,死循環!

解決方法

建立一個基礎的鏡像,生成新的的鏡像後,再封裝成咱們所須要的鏡像

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%狀況下使用此方法)

Images namespaces命名空間

咱們拉取鏡像時有如下幾種方式

  • 1.默認拉取官方封裝好的鏡像(官方: 啓動docker所設置的docker RegistryURl)
    docker pull centos
  • 2.拉取指定用戶構建的鏡像
    docker pull zhourudong/myweb
  • 3.完整的地址
    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倉庫進行拉取

tag打標籤

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應運而生

使用Dockerfile來構建鏡像

從Doclerfile構建鏡像

$ 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 and ENTRYPOINT

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:/#

CPOY /ADD

時候構建代碼時,代碼並不在容器中(在宿主機上), 咱們須要使用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 ... 壓縮成單一層鏡像

Multi-stage builds 多階段構建

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

Dockerfile tip

entrypoint script

#!/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 label

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 網路

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>
相關文章
相關標籤/搜索