Web 應用的自動化打包和釋出。
自動化測試和持續整合、釋出。
在服務型環境中部署和調整資料庫或其他的後臺應用。
從頭編譯或者擴充套件現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。
Docker 是一個用於開發,交付和執行應用程式的開放平臺。Docker 使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體。藉助 Docker,您可以與管理應用程式相同的方式來管理基礎架構。通過利用 Docker 的方法來快速交付,測試和部署程式碼,您可以大大減少編寫程式碼和在生產環境中執行程式碼之間的延遲。
(1)、快速,一致地交付您的應用程式
Docker 允許開發人員使用您提供的應用程式或服務的本地容器在標準化環境中工作,從而簡化了開發的生命週期。
容器非常適合持續整合和持續交付(CI / CD)工作流程,請考慮以下範例方案:
您的開發人員在本地編寫程式碼,並使用 Docker 容器與同事共用他們的工作。
他們使用 Docker 將其應用程式推播到測試環境中,並執行自動或手動測試。
當開發人員發現錯誤時,他們可以在開發環境中對其進行修復,然後將其重新部署到測試環境中,以進行測試和驗證。
測試完成後,將修補程式推播給生產環境,就像將更新的映象推播到生產環境一樣簡單。
(2)、響應式部署和擴充套件
Docker 是基於容器的平臺,允許高度可移植的工作負載。Docker 容器可以在開發人員的本機上,資料中心的物理或虛擬機器器上,雲服務上或混合環境中執行。
Docker 的可移植性和輕量級的特性,還可以使您輕鬆地完成動態管理的工作負擔,並根據業務需求指示,實時擴充套件或拆除應用程式和服務。
(3)、在同一硬體上執行更多工作負載
Docker 輕巧快速。它為基於虛擬機器器管理程式的虛擬機器器提供了可行、經濟、高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker 非常適合於高密度環境以及中小型部署,而您可以用更少的資源做更多的事情。
yum -y install yum-utils device-mapper-persistent-data lvm2
//yum-utils 提供了yum-config-manager
//device mapper 儲存驅動程式需要device-mapper-persistent-data和lvm2
//device mapper 是Linux2.6核心中支援邏輯卷管理的通用裝置對映機制。
//它為實現用於儲存資源管理的塊裝置驅動提供了一個而高度模組化的核心架構
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl start docker.service
systemctl enable docker.service
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
進入阿里雲官網》》搜尋映象加速》》選擇centos版的
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1i3tpy0i.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
service network restart
systemctl restart docker
docker version
docker search nginx
docker pull nginx
docker pull redis
docker pull -a redis
docker pull bitnami/redis
docker images //檢視下載映象資訊
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 8 days ago 133MB
REPOSITORY:表示映象的倉庫源
TAG:映象的標籤
IMAGE ID:映象ID
CREATED:映象建立時間
SIZE:映象大小
//含中間映像層
docker images -a
//只顯示映象ID
docker images -q
//含中間映像層
docker images -qa
//顯示映象摘要資訊(DIGEST列)
docker images --digests
//顯示映象完整資訊
docker images --no-trunc
docker inspect 7e4d58f0e5f3
docker tag nginx:latest nginx:web
[root@localhost opt]# docker tag nginx:latest nginx:web
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 8 days ago 133MB
nginx web 7e4d58f0e5f3 8 days ago 133MB
//檢視映象Nginx資訊
[root@localhost opt]# docker images | grep nginx
nginx latest 7e4d58f0e5f3 8 days ago 133MB
nginx web 7e4d58f0e5f3 8 days ago 133MB
docker rmi nginx:web (如果只有一個別名,那麼這個就是刪除docker。如果是多個標籤,那麼就是隻是刪除一個標籤)
docker rmi docker——id 注:刪除docker如果有其他別名需要刪除只剩一個,才能刪除docker
在刪除容器之前需要先停止容器
docker rmi redis
docker rmi -f redis
docker rmi -f redis tomcat nginx
docker rmi -f $(docker images -q)
docker save -o 檔名 映象id或者映象別名
[root@localhost ~] docker save -o /opt/nginx 7e4d58f0e5f3
[root@localhost opt] docker save -o nginx1 nginx:latest
[root@localhost ~]cd /opt
[root@localhost opt] ll
總用量 133636
drwx--x--x. 4 root root 28 9月 17 15:43 containerd
-rw-------. 1 root root 136841216 9月 19 19:04 nginx
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
docker load --input 匯出檔名
docker load < 匯出檔名
[root@localhost opt] docker load --input nginx
Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
[root@localhost opt] docker load < nginx
Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
[root@localhost opt] docker load --input nginx1
Loaded image: nginx:latest
docker create -it nginx:latest /bin/bash
[root@localhost opt] docker create -it nginx:latest /bin/bash
59c4c2f2b6a00bceb196f1bbcfe02fc5a2e16edc66feb12310c9474bf939d833
語法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS說明:
-a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
-d: 後臺執行容器,並返回容器ID;
-i: 以互動模式執行容器,通常與 -t 同時使用;
-P: 隨機埠對映,容器內部埠隨機對映到主機的埠
-p: 指定埠對映,格式為:主機(宿主)埠:容器埠
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--name="nginx-lb": 為容器指定一個名稱;
--dns 8.8.8.8: 指定容器使用的DNS伺服器,預設和宿主一致;
--dns-search example.com: 指定容器DNS搜尋域名,預設和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 設定環境變數;
--env-file=[]: 從指定檔案讀入環境變數;
--cpuset="0-2" or --cpuset="0,1,2": 繫結容器到指定CPU執行;
-m :設定容器使用記憶體最大值;
--net="bridge": 指定容器的網路連線型別,支援 bridge/host/none/container: 四種型別;
--link=[]: 新增連結到另一個容器;
--expose=[]: 開放一個埠或一組埠;
--volume , -v: 繫結一個卷
範例
使用docker映象nginx:latest以後臺模式啟動一個容器,並將容器命名為mynginx。
docker run --name mynginx -d nginx:latest
使用映象nginx:latest以後臺模式啟動一個容器,並將容器的80埠對映到主機隨機埠。
docker run -P -d nginx:latest
使用映象 nginx:latest,以後臺模式啟動一個容器,將容器的 80 埠對映到主機的 80 埠,主機的目錄 /data 對映到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
繫結容器的 8080 埠,並將其對映到本地主機 127.0.0.1 的 80 埠上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用映象nginx:latest以互動模式啟動一個容器,在容器內執行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
docker ps -a
[root@localhost opt] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59c4c2f2b6a0 nginx:latest "/docker-entrypoint.…" 2 minutes ago Created pedantic_bose
//顯示最近建立容器
docker ps -l
//顯示最近建立的3個容器
docker ps -n 3
//不截斷輸出
docker ps --no-trunc
//獲取映象redis的元資訊
docker inspect redis
//獲取正在執行的容器redis的 IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis
//檢視正在執行的容器
docker ps
//檢視正在執行的容器的ID
docker ps -q
//檢視正在執行+歷史執行過的容器
docker ps -a
//顯示執行容器總檔案大小
docker ps -s
docker start 59c4c2f2b6a0
檢視映象 up 狀態
[root@localhost opt] docker start 59c4c2f2b6a0
59c4c2f2b6a0
[root@localhost opt] docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59c4c2f2b6a0 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 9 seconds 80/tcp pedantic_bose
docker stop 容器ID
docker restart 容器ID
docker pull centos 7
docker create it centos 7 /bin/bash
docker start 8c6dd3246eb4
docker run nginx /usr/bin/bash -c ls
執行完成直接關閉,狀態是exited
持續在後臺執行
容器進入
[root@localhost opt] docker exec -it 8c6dd3246eb4 /bin/bash
docker exec :在執行的容器中執行命令
-d :分離模式: 在後臺執行
-i :即使沒有附加也保持STDIN 開啟
-t :分配一個偽終端
docker exec -i -t mynginx /bin/bash
docker exec -it 9df70f9a0714 /bin/bash
exit 退出
docker export 8c6dd3246eb4 > nginx_c
8c6dd3246eb4:容器ID
Nginx_c :匯出容器檔名
cat nginx_c | docker import - nginx:web
nginx_c:匯出的容器檔名
nginx:web:新的容器名
[root@localhost opt] docker rm 8c6dd3246eb4
Error response from daemon: You cannot remove a running container 8c6dd3246eb42099dbf58e2730f348acc21b685a4f27c60185d9a427e1282f09. Stop the container before attempting removal or force remove
[root@localhost opt] docker stop 8c6dd3246eb4
8c6dd3246eb4
[root@localhost opt] docker rm 8c6dd3246eb4
8c6dd3246eb4
方法一:docker ps -a | awk '{print "docker rm $1"}' | bash
方法二:
[root@localhost opt]docker rm -f $(docker ps -aq)
395dab3d44df
2b52ff42681f
1627dc7213cd
960857ff1ba0
59c4c2f2b6a0
//強制殺死程序容器(處於執行狀態才能殺死程序-docker start id)
docker kill id
docker rm -f redis
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
docker rm -l db
docker rm -v redis
vim none.sh
docker ps -a | grep "Exited" | awk '{print $1}'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1}'|xargs docker rm
docker images|grep none|awk '{print $3}'|xargs docker rmi
-f :通過 SIGKILL 訊號強制刪除一個執行中的容器。
-l :移除容器間的網路連線,而非容器本身
-v :刪除與容器關聯的卷。
容器程序
//top支援 ps 命令引數,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
//列出redis容器中執行程序
docker top redis(容器ID)
//檢視所有執行容器的程序資訊
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
//檢視redis容器紀錄檔,預設引數
docker logs rabbitmq
//檢視redis容器紀錄檔,引數:-f 跟蹤紀錄檔輸出;-t 顯示時間戳;--tail 僅列出最新N條容器紀錄檔;
docker logs -f -t --tail=20 redis
//檢視容器redis從2019年05月21日後的最新10條紀錄檔。
docker logs --since="2019-05-21" --tail=10 redis
docker pause :暫停容器中所有的程序
docker unpause :恢復容器中所有的程序。
範例
暫停資料庫容器db01提供服務。
docker pause db01
恢復資料庫容器db01提供服務。
docker unpause db01
docker create -it jasonlix/docker-cobbler /bin/bash
docker commit -m "new" -a "daoke" c83aee844ae0 daoke:test
docker images | grep daoke
將檔案debian-7.0-x86-minimal.tar.gz拖至opt目錄中
[root@localhost opt] cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
sha256:6683b936f5574560c919751a6622d4131bb7fb4d88f7a9614c55fb7f554ef2c0
[root@localhost opt] docker images | grep new
daoke new 6683b936f557 13 seconds ago 215MB
mkdir apache
cd apache
vim Dockerfile
#基於的基礎映象
FROM centos
#維護映象的使用者資訊
MAINTAINER The project <cloud-ops@centos.org>
#映象操作指令安裝Apache軟體
RUN yum -y update
RUN yum -y install httpd
#開啟80埠
EXPOSE 80
#複製網站首頁檔案
ADD index.html /var/www/html/index.html
#將執行指令碼複製到映象中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#啟動容器時執行指令碼
CMD ["/run.sh"]
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
echo "web test" > index.html
docker build -t httpd:centos1 . (注意別忘了末尾有「.」)
docker run -d -p 1216:80 httpd:centos1
docker start 4fbc428fac3a (開啟容器)
[root@localhost apache]docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fbc428fac3a httpd:centos1 "/run.sh" 8 seconds ago Up 7 seconds 0.0.0.0:1216->80/tcp affectionate_lovelace
a4f43a12352e registry "/entrypoint.sh /etc…" 2 hours ago Exited (2) 40 minutes ago goofy_bose
ba786a224305 registry "/entrypoint.sh /bin…" 2 hours ago Exited (127) 2 hours ago zen_hamilton
(1)資料管理操作
(2)兩種管理方式
(3)建立資料卷
docker run -d -v /data1 -v /data2 --name web httpd:centos
docker run -d -v /var/www:/data1 --name web-1 httpd:centos
docker pull centos
//宿主機目錄/var/www掛載容器中的/data1
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
cd /data1
touch test123
//返回宿主機進行檢視
ls /var/www
//資料卷容器
docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash ##(加/bin/bash 就是可以直接進入容器)
docker run -it -volumes-from web100 --name db1 centos /bin/bash
註釋:容器web100 和容器db1 所掛載的目錄data1和data2 資料是同步執行的。
docker run -d -p httpd:centos
docker run -d -p 49280:80 httpd:centos
docker ps -a
docker pull registry
[root@localhost /]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pulling fs layer
47112e65547d: Pulling fs layer
46bcb632e506: Pulling fs layer
c1cc712bcecd: Pulling fs layer
3db6272dcbfa: Pulling fs layer
latest: Pulling from library/registry
cbdbe7a5bc2a: Pulling fs layer
47112e65547d: Pulling fs layer
46bcb632e506: Pulling fs layer
c1cc712bcecd: Pulling fs layer
3db6272dcbfa: Pulling fs layer
open /var/lib/docker/tmp/GetImageBlob684407966: no space left on device
---------------------------------------------------
vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.75.200:5000"], //新增
"registry-mirrors": ["https://1i3tpy0i.mirror.aliyuncs.com"]
}
~
systemctl restart docker.service
docker create -it registry /bin/bash #新建容器
docker ps -a
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba786a224305 registry "/entrypoint.sh /bin…" 44 minutes ago Exited (127) 9 minutes ago zen_hamilton
docker start 231d40e811cd ##開啟(不是up是正確的)
##宿主機的/data/registry自動建立掛載容器中的/tmp/registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
docker pull httpd
##更改標記為192.168.75.200:5000/httpd
docker tag httpd:latest 192.168.75.200:5000/httpd (標記IP地址與私有倉庫的地址和埠相一致)
docker push 192.168.75.200:5000/httpd ##上傳映象
##獲取私有倉庫列表
curl -XGET http://192.168.75.200:500/v2/_catalog
docker pull 192.168.75.200:500/httpd ##測試私有倉庫下載映象
docker run -d -P httpd:centos ##隨機分配外部的對映埠
docker run -d -p 43992:80 httpd:centos ##指定埠對映
docker ps -a ##檢視
(1)埠對映進行容器互聯
docker run -itd -P --name web1 ecntos /bin/bash
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
埠對映並不是唯一把 docker 連線到另一個容器的方法。
docker 有一個連線系統允許將多個容器連線在一起,共用連線資訊。
docker 連線會建立一個父子關係,其中父容器可以看到子容器的資訊。
(2)網路設定進行容器互聯
新建網路
下面先建立一個新的 Docker 網路。
$ docker network create -d bridge test-net
引數說明:
-d:引數指定 Docker 網路型別,有 bridge、overlay。
其中 overlay 網路型別用於 Swarm mode,在本小節中你可以忽略它。
連線容器
執行一個容器並連線到新建的 test-net 網路:
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
開啟新的終端,再執行一個容器並加入到 test-net 網路:
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
apt-get update
apt install iputils-ping
下面通過 ping 來證明 test1 容器和 test2 容器建立了互聯關係。
如果 test1、test2 容器內中無 ping 命令,則在容器內執行以下命令安裝 ping(即學即用:可以在一個容器裡安裝好,提交容器到映象,在以新的映象重新執行以上倆個容器)。