Docker學習整理
docker 容器
阿里雲docker安裝指令碼:curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
DaoCloud 的安裝指令碼:curl -sSL https://get.daocloud.io/docker | sh
映象:特殊的檔案系統,由多層檔案系統組成,提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)
容器:容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。容器的實質是程序,容器可以擁有自己的 root 檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者 ID 空間。
倉庫:集中的儲存、分發映象的服務,一個倉庫會包含同一個軟體不同版本的映象
安裝:
1.獲取docker-ce(社群版)源:
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.加速快取: yum makecache fast
3.安裝docker-ce : yum -y install epel-release
yum -y install docker-ce
4.啟動docker :systemctl enable docker
systemctl start docker
5.新增核心引數 :tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p
6.新增映象加速器 : vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
或者:vim /var/lib/systemd/system/docker.service
--insecure-registry=0.0.0.0:5000
7.重啟docker :systemctl daemon-reload
systemctl restart docker
8.安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2
9.新增使用者和組:groupadd docker
usermod -aG docker $USER
10.測試;docker run hello-world
映象image:
8.列出映象 :docker image ls
8.查詢映象 :docker search centos
9.獲取映象 :docker pull IP:5000/ubuntu(倉庫名):16.04(標籤)
9.打標籤映象 :docker tag ubuntu:17.10(原有) IP:埠/ubuntu:17.10
docker push username/ubuntu:17.10
10.執行映象 :docker run -it --rm ubuntu:16.04 bash :-i互動式操作, -t終端, bash執行一些命令並檢視返回結果,
--rm :這個引數是說容器退出後隨之將其刪除
11.檢視系統版本 :cat /etc/os-release
13.檢視映象佔用空間 :docker system df
14.檢視虛懸映象 :docker image ls -f dangling=true
15.刪除虛懸映象 :docker image prune
16.刪除映象(一般做法) ,一個映象可能指向多個標籤: docker image rm 映象ID/映象名
17.精確刪除映象 :docker image ls --digests redis
docker image rm
18.列出指定範圍的ID列表 :docker image ls -q
執行映象 : docker run --name webserver -d -p 80:80 nginx :用 nginx 映象啟動一個容器,命名為 webserver ,並且映射了 80 埠
20.修改Nginx主頁 : docker exec -it webserver bash
echo '<h1>hello,Docker!</h1>' > /usr/share/nginx/html/index.html
21.檢視映象改動 : docker diff webserver
22.儲存映象 :docker commit --author "Huang <
23.檢視映象內歷史記錄 :docker history nginx:v2
24.執行定製映象 : docker run --name=web2 -it --rm -p 8080:8080 nginx:v2
docker run -p 8008:8080 tomcat
Dockerfile定製映象;建立Dockerfile檔案,
FROM nginx (以哪個映象為基礎)
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html (每一個RUN行為都會建立一層映象,有多個時用&&)
25.在Dockerfile目錄下構建 : docker build -t nginx:v3 .
容器:
26.檢視容器 :docker container ls
27.停止容器 :docker container stop 容器ID
socker stop $(docker ps -q)
28.啟動容器 : docker container start 容器ID
29.進入容器 : (1)attach (退出時會停止容器)
docker run -dit ubuntu :-d,容器啟動進入後臺
docker container ls
docker attach 容器ID
(2)exec(退出時不會停止容器)
docker run -dit ubuntu
docker container ls
docker exec -it 容器ID /bin/bash(不加t沒有終端)
30.匯出容器 :docker export 容器ID > 容器名.tar
31.刪除容器 : docker container rm 容器ID
32.匯入容器 :cat 容器.tar | docker import - 容器名:v1.0
33.清理所有停止狀態的容器 :docker container prune
倉庫(本地):31.建立存放映象倉庫目錄 :mkdir /opt/data
32.安裝倉庫工具 :docker run -d -p 5000:5000 -v /opt/data/registry(指定路徑):/var/lib/registry(預設路徑) registry
38.配置加速器 :vim /etc/docker/daemon.json
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.12.28:5000
39.重啟 :systemctl daemon-reload
systemctl restart docker.service
33.自定義映象 :docker tag centos:latest 127.0.0.1:5000/centos:latest
35.上傳映象 :docker push 127.0.0.1:5000/centos:latest
36.檢視 :curl 192.168.12.199:5000/v2/
http://192.168.12.199:5000/v2(倉庫版本)/_catalog
37.下載映象 :docker pull 127.0.0.1:5000/ubuntu:latest
38. find / -name config.yml
39. filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
40.刪除倉庫映象:curl -XGET http://192.168.11.196:5000/v2/httpd/tags/list
curl -v -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X HEAD http://192.168.11.196:5000/v2/httpd/manifests/v1
curl -XDELETE 192.168.11.196:5000/v2/httpd/manifests/sha256:6c2906f645126a744fdb79031b02d419fa977f8479174c0b63ca45513247cd1a
資料卷:
34.檢視資料卷 :docker volume ls
35.建立資料卷 ;docker volume create my-vol
36.檢視指定資料卷 :docker volume inspect my-vol
37.刪除資料卷 :先停容器,刪容器,再刪資料卷 :docker volume rm
38.掛載資料卷 :docker run -d -P --name web --mount source=my-vol,target=/webapp training/webapp python app.py
39.掛載只讀資料卷 :docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly training/webapp python app.py
40.掛載本地資料捲到映象 :docker run -it -v /usr/share/logstash/data:/usr/share/logstash/data:rw logstash:v1 /bin/bash
網路:
40.檢視容器埠對映 :docker container ls
41.將本地埠5000對映到容器埠5000 :docker run -d -p 5000:5000 training/webapp python app.py
42.檢視對映埠配置 : docker container ls
docker port nostalgic_morse 5000
43.建立docker網路 : docker network create -d bridge my-net
44.執行一個容器並連線到網路 :docker run -it --rm --name busybox1 --network my-net busybox sh
45.執行第二個容器連線到網路 :docker run -it --rm --name busybox2 --network my-net busybox sh
docker-compose:是用來組裝多容器應用的工具,可以在 Swarm叢集中部署分散式應用。
46.獲取二進位制包 :curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
47.給予執行許可權 : chmod +x /usr/local/bin/docker-compose
48.compose專案包含三部分 :app.py, Dokcerfile, docker-compose.yml(version,services,web,build,ports,redis,image....)
49.執行compose專案 : docker-compose up
50.檢視日誌 :docker logs -f -t --tail 行數 容器名
docker-machine :是支援多平臺安裝Docker的工具,使用 Docker Machine,可以很方便地在筆記本、雲平臺及資料中心裡安裝Docker。
49.安裝virtualbox驅動:
[virtualbox]
name=Oracle Linux/RHEL/CentOS-$releasever/$basearch-VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
50.查詢virtualbox:yum search virtualbox
50.安裝最新版:yum -y install VirtualBox-5.2.x86_64
50.初始化:/sbin/vboxconfig
51.安裝核心:yum -y install kernel-devel kernel-devel-3.10.0-862.el7.x86_64
50.初始化:/sbin/vboxconfig
50.安裝 :curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && install /tmp/docker-machine /usr/local/bin/docker-machine
51檢視版本 :docker-machine -v
52.建立docker管理主機 :docker-machine create -d virtualbox manager
docker-swarm叢集:
一、單節點主機使用virtualbox驅動建立叢集:
1.建立docker管理主機 :docker-machine create -d virtualbox manager
--engine-opt dns=114.114.114.114 配置 Docker 的預設 DNS
--engine-registry-mirror https://registry.docker-cn.com 配置 Docker 的倉庫映象
--virtualbox-memory 2048 配置主機記憶體
--virtualbox-cpu-count 2 配置主機 CPU
2.檢視管理主機環境: docker-machine env manager
3.遠端到管理主機 :docker-machine ssh manager
4.初始化IP:docker swarm init --advertise-addr 192.168.99.100(記住返回祕鑰資訊,用於加入叢集認證)
5.建立工作節點:docker-machine create -d virtualbox worker1
6.登入到工作主機 :docker-machine ssh worker1
7.加入叢集 :docker swarm join --token SWMTKN-1-6blwl0474odjjsln41geym4n87ba4czrmy00ojn6h5k2nm20mc-b9llptcgnc23wrhtyk7nr9wda 192.168.99.100:2377
8.檢視連線令牌:docker swarm join-token manager
8.檢視叢集節點:docker-machine ls
9.刪除:docker-machine rm -f $(docker-machine ls -q)
9.檢視leader節點:docker node ls
10.刪除swarm叢集: docker swarm leave --force
11.刪除節點:docker node rm worker1
12.管理節點部署Nginx :docker service create --replicas 3(docker主機數) -p 80:80 --name nginx nginx:1.13.7-alpine(版本)
13.檢視服務(管理) :docker service ls / docker service ps nginx
14.啟動服務 :docker service update 服務名
15.檢視日誌 :docker service logs nginx
16.擴容服務(容器) :docker service scale nginx=5(先分給manager,再給worker)
docker service ps nginx
17.收縮服務(容器) :docker service scale nginx=2
docker service ps nginx
18.刪除服務(容器) :docker service rm nginx
19.docker-swarm部署compose: docker stack deploy -c docker-compose.yml wordpress
20.檢視docker-compose服務: docker stack ls
21.刪除服務 : docker stack rm
22.swarm叢集管理敏感資料 : openssl rand -base64 20 | docker secret create mysql_password -
openssl rand -base64 20 | docker secret create mysql_root_password -
23.檢視密碼 :docker secret ls
24.建立MySQL服務 : docker network create -d overlay mysql_private
25.升級 : docker service update --image nginx:1.13.12-alpine nginx
26.回退 :docker service rollback nginx
二、多節點主機swarm叢集
獲取yum源: # cd /etc/yum.repos.d/
# mv CentOS-Base.repo CentOS-Base.repo.bak
# wget http://mirrors.aliyun.com/repo/Centos-7.repo
# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
# yum clean all
# yum makecache
安裝網路工具和基礎包:# yum install net-tools checkpolicy gcc dkms foomatic openssh-server bash-completion -y
修改hostname:# hostnamectl --static set-hostname c1
設定免密登入:# ssh-keygen
# vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#ssh-copy-id c1
#ssh-copy-id c2
安裝docker:# mkdir -p ~/_src \
&& cd ~/_src \
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.3-1.el7.centos.noarch.rpm \
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.3-1.el7.centos.x86_64.rpm \
&& wget http://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-debuginfo-1.12.3-1.el7.centos.x86_64.rpm \
&& yum localinstall -y docker-engine-selinux-1.12.3-1.el7.centos.noarch.rpm docker-engine-1.12.3-1.el7.centos.x86_64.rpm docker-engine-debuginfo-1.12.3-1.el7.centos.x86_64.rpm
# docker version
# systemctl enable docker && systemctl start docker
修改docker配置檔案:# vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -s=overlay --registry-mirror=https://7rgqloza.mirror.aliyuncs.com --insecure-registry=localhost:5000 -H unix:///var/run/docker.sock --pidfile=/var/run/docker.pid
# systemctl daemon-reload && systemctl restart docker.service
開啟防火牆埠:# firewall-cmd --zone=public --add-port=2377/tcp --permanent && \
firewall-cmd --zone=public --add-port=7946/tcp --permanent && \
firewall-cmd --zone=public --add-port=7946/udp --permanent && \
firewall-cmd --zone=public --add-port=4789/tcp --permanent && \
firewall-cmd --zone=public --add-port=4789/udp --permanent && \
firewall-cmd --reload
# firewall-cmd --list-ports
初始化swarm:# docker swarm init --advertise-addr 192.168.11.199(c1的ip)
c2加入叢集
設定c2為主節點:# docker swarm leave
c1: # docker swarm join-token manager
docker集中化web管理平臺
一、shipyard
1.啟動docker,下載映象
# systemctl restart docker
# docker pull alpine
# docker pull microbox/etcd
# docker pull library/rethinkdb
# docker pull shipyard/docker-proxy
# docker pull swarm
# docker pull shipyard/shipyard
2.下載shipyard指令碼
# wget https://raw.githubusercontent.com/shipyard/shipyard-project.com/master/site/themes/shipyard/static/deploy
# bash deploy
# http://192.168.11.199:8080
3.優點
# 支援映象管理、容器管理。
# 支援控制檯命令
# 容器資源消耗監控
# 支援叢集swarm,可以隨意增加節點
# 支援控制使用者管理許可權,可以設定某個容器對某個使用者只讀、管理許可權。
# 有漢化版
4.缺點
# 啟動容器較多,佔用每個節點的一部分資源
# 相容性性不高,可能是我自身原因,經常打不開首頁。
二、portainer
1.下載映象
docker pull docker.io/portainer/portainer
2.啟動
# docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer
# http://192.168.11.199:9000
3.優點
# 支援容器管理、映象管理
# 輕量級,消耗資源少
# 基於docker api,安全性高,可指定docker api埠,支援TLS證書認證。
# 支援許可權分配
# 支援叢集
4.缺點
# 功能不夠強大。
# 容器建立後,無法通過後臺增加埠。
三、dockerUI
1.下載映象
# docker pull uifd/ui-for-docker
2.啟動
# docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker
# http://192.168.11.199:9000
3.優點
# 支援容器管理
# 支援映象管理
# 基於docker api,自身也是一個容器。
# 穩定性高
# 可動態顯示顯示容器之間關係圖
# 容器管理,增加埠對映,增加系統變數、對映目錄等
4.缺點
# 沒有登入驗證,因為沒有登入體系,目前解決辦法是,只開放本地訪問,或者通過TLS來對許可權進行控制。
# 無法分配某容器給某使用者。
# 不支援多主機。
# 不支援叢集swarm等
# 功能少
# 不支援控制檯命令
etcd : 是 CoreOS 團隊發起的一個管理配置資訊和服務發現的專案,它的目標是構建一個高可用的分散式鍵值( key-value )資料庫,埠號2379 、2380
下載: curl -L https://github.com/coreos/etcd/releases/download/v3.2.10/etcd-v3.2.10-linux-amd64.tar.gz -o etcd-v3.2.10-linux-amd64.tar.gz
解壓: tar zxvf etcd-v3.2.10-linux-amd64.tar.gz
進入相關目錄: cd etcd-v3.2.10-linux-amd64
拷貝到可執行目錄: cp etcd* /usr/local/bin/
啟動服務: etcd
檢查是否啟動成功: etcdctl member list
設定環境變數: echo 'export ETCDCTL_API=3' >>/etc/profile
測試: etcdctl put testkey(鍵) "hello world"(值)
獲取: etcdctl get testkey
docker中 啟動所有的容器命令
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker中 關閉所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker中 刪除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
docker中 刪除所有的映象
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
Dockerfile命令
1.FROM :指定基礎映象(必須第一條)
2.RUN :執行指定命令
3.CMD :容器啟動時執行的命令
4.LABEL :為映象指定標籤
5.MAINTAINER : 指定作者
6.EXPOSE : 暴露容器執行時監聽埠給外部
7.ENV :指定環境變數
8.ADD :複製,將檔案複製到映象中
9.COPY :複製
10.ENTRYPOINT : 啟動時的預設命令
11.VOLUME : 將內地資料夾或者其他容器種得資料夾掛在到這個容器中
12.USER :設定啟動容器的使用者,可以是使用者名稱或UID
13.WORKDIR :設定工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在則會建立,也可以設定多次。
14.ARG :設定變數命令
15.ONBUILD : 這個命令只對當前映象的子映象生效。
16.STOPSIGNAL : 當容器推出時給系統傳送什麼樣的指令
17.HEALTHCHECK : 容器健康狀況檢查命令
18.docker history 映象名 : 逆向檢視dockerfile構建過程
Docker-compose命令
1. version :指定版本號
2. services :服務
3. build :指定 Dockerfile 所在資料夾的路徑
4. cap_add :指定容器的核心能力(capacity)分配。
5. command :覆蓋容器啟動後預設執行的命令。
6. container_name :指定容器名稱
7. devices :指定裝置對映關係。
8. depends_on :解決容器的依賴、啟動先後的問題
9. dns :自定義 DNS 伺服器。可以是一個值,也可以是一個列表
10. dns_search :配置 DNS 搜尋域。可以是一個值,也可以是一個列表。
11. tmpfs :掛載一個 tmpfs 檔案系統到容器。
12. env_file :從檔案中獲取環境變數,可以為單獨的檔案路徑或列表。
13. environment :設定環境變數
14. expose : 暴露埠,但不對映到宿主機,只被連線的服務訪問。
15. image :指定為映象名稱或映象 ID。如果映象在本地不存在, Compose 將會嘗試拉取這個映象。
16. labels :為容器新增 Docker 元資料(metadata)資訊
17. logging :配置日誌選項。
18. network_mode :設定網路模式。
19. networks :配置容器連線的網路。
20. pid :跟主機系統共享程序名稱空間。開啟該選項的容器之間,以及容器和宿主機系統之間可以通過程序 ID 來相互訪問和操作。
21. ports :暴露埠資訊。使用宿主埠:容器埠 (HOST:CONTAINER) 格式,或者僅僅指定容器的埠(宿主將會隨機選擇埠)都可以。
22. secrets :儲存敏感資料。
23. sysctls :配置容器核心引數。
24. ulimits :指定容器的 ulimits 限制值。
25. volumes :資料卷所掛載路徑設定
26. deploy : 指定與部署和執行服務相關的配置