Docker版本選擇:
Docker之前沒有區分版本,但是2017年推出(將docker更名為)新的項目Moby,github地址:https://github.com/moby/moby,Moby項目屬于Docker項目的全新上游,Docker將是一個隸屬于的Moby的子產品,而且之后的版本之后開始區分為CE版本(社區版本)和EE(企業收費版),CE社區版本和EE企業版本都是每個季度發布一個新版本,但是EE版本提供后期安全維護1年,而CE版本是4個月。
下載rpm包安裝:
官方rpm包下載地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里鏡像下載地址:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
通過修改yum源安裝
[root@docker-server1 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@docker-server1 ~]# yum repolist
[root@docker-server1 ~]# yum install -y docker-ce
# 啟動并驗證docker服務:
[root@docker-server1 ~]# systemctl start docker
[root@docker-server1 ~]# systemctl enable docker
# docker 版本
[root@localhost ~]# docker version
# docker 信息
[root@localhost ~]# docker info
#更改源地址
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/
docker程序環境:
docker環境配置文件:
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker
Unit File:
/usr/lib/systemd/system/docker.service
Docker Registry配置文件:
/etc/containers/registries.confdocker-ce:
配置文件:/etc/docker/daemon.json
docker 鏡像加速配置
獲取加速地址:
瀏覽器打開 https://cr.console.aliyun.com/#/accelerator,注冊或登錄阿里云賬號,點擊左側的鏡像加速器,將會得到一個專屬的加速地址,而且下面有使用配置說明:
image.png
?```
中國科技大學
?```
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
# 生成配置文件
[root@docker-server1 ~]# mkdir -p /etc/docker
[root@docker-server1 ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://registry.docker-cn.com"]
> }
> EOF
# 重啟docke服務
[root@docker-server1 ~]# systemctl daemon-reload
[root@docker-server1 ~]# sudo systemctl restart docker
Docker 鏡像基礎命令
Docker Registry
?啟動容器時,docker daemon會試圖從本地獲取相關的鏡像;本地鏡像
不存在時,其將從Registry中下載該鏡像并保存到本地;
?倉庫是一個無狀態的、高度可伸縮的服務器端應用程序,它存儲并允許你分發Docker映像。
Docker Registry 分類
?Registry用于保存docker鏡像,包括鏡像的層次結構和元數據
?用戶可自建Registry,也可使用官方的Docker Hub
?分類
? Sponsor Registry:第三方的registry,供客戶和Docker社區使用
? Mirror Registry:第三方的registry,只讓客戶使用
?Vendor Registry:由發布Docker鏡像的供應商提供的registry
? Private Registry:通過設有防火墻和額外的安全層的私有實體提供的registry
Registry(repository and index)
?Repository
?由某特定的docker鏡像的所有迭代版本組成的鏡像倉庫
?一個 Registry中可以存在多個Repository ? Repository可分為“頂層倉庫”和“用戶倉庫” ? 用戶倉庫名稱格式為“用戶名/倉庫名” ?每個倉庫可以包含多個Tag(標簽) ,每個標簽對應一個鏡像
?Index
?維護用戶帳戶、鏡像的校驗以及公共命名空間的信息
?相當于為Registry提供了一個完成用戶認證等功能的檢索接口
Docker Registry
?Docker Registry中的鏡像通常由開發人員制作,而后推送至“公共”或“
私有”Registry上保存,供其他人員使用,例如“部署”到生產環境;
Docker Hub
?Docker Hub是一個基于云的倉庫服務,它允許你鏈接到代碼庫,構建你的鏡像并測試它們,存儲手動推送的鏡像,以及鏈接到Docker Cloud,這樣你就可以將鏡像部署到你的主機上。
?它為整個開發流程中的容器映像發現、分發和更改管理、用戶和團隊協作以及工作流自動化提供了一個集中的資源。
?Docker Hub提供以下主要功能
?鏡像存儲庫
?從社區和官方倉庫中查找和提取鏡像,并管理、推送和從您可以訪問的私人倉庫中提取鏡像。
?自動構建
?更改源代碼存儲庫時自動創建新鏡像。
?webhooks
?webhooks是自動化構建的一個功能,它允許您在成功推送到存儲庫后觸發操作。
?組織
?創建工作組以管理對鏡像存儲庫的訪問。
?GitHub和BitBucket集成
?將倉庫和Docker鏡像添加到當前工作流中。
# 搜索鏡像
[root@docker-server1 ~]# docker search centos:7.2.1511 #帶指定版本號
[root@docker-server1 ~]# docker search centos #不帶版本號默認latest
# 下載鏡像
[root@docker-server1 ~]# docker pull centos:7.2.1511 #帶指定版本號
[root@docker-server1 ~]# docker pull centos #不帶版本號默認latest
#從遠程倉庫獲取Docker鏡像(例如你自己的Docker倉庫)并將它們添加到本地系統中,使用docker pull命令:
# docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
#<registry>是在TCP<port>上提供Docker分發服務的主機(默認值:5000)
#<namespace>和<name>標識由該注冊表中的<namespace>控制的特定鏡像
#一些倉庫還支持raw<name>;對于這些注冊表,<namespace>是可選的
#但是,當包含時,<namespace>提供的額外層次結構有助于區分具有相同<name>的鏡像
[root@docker-server1 ~]# docker pull registry.mirror.com:5000/nginx:1.12-alpine
# 查看本地鏡像
[root@docker-server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 63130206b0fa 5 days ago 98.2MB
# REPOSITORY #鏡像所屬的倉庫名稱
# TAG #鏡像版本號(標識符),默認為latest
# IMAGE ID #鏡像唯一ID標示
# CREATED #鏡像創建時間
# VIRTUAL SIZE #鏡像的大小
Docker容器操作基礎命令
命令格式:
docker run [選項] [鏡像名] [shell命令] [參數]
docker run [參數選項] [鏡像名稱,必須在所有選項的后面] [/bin/echo 'hello wold'] #單次執行,沒有自定義容器名稱
docker run centos /bin/echo 'hello wold' #啟動的容器在執行完shel命令就退出了
#容器的狀態:
created:
runing:
paused:
stopped:
deleted:
# 從鏡像啟動一個容器:
# 會直接進入到容器,并隨機生成容器ID和名稱
[root@docker-server1 ~]# docker run -it docker.io/centos bash
[root@11445b3a84d3 /]#
# 退出容器不注銷
ctrl+p+q
# 顯示容器 -a:包括顯示暫停和關閉的所有容器 -q:只顯示容器Id
[root@linux-docker ~]# docker ps -a -q
# 刪除運行中的容器:
# 即使容正在運行當中,也會被強制刪除掉 rm -f
[root@docker-server1 ~]# docker rm -f 11445b3a84d3
# 隨機映射端口:-P
[root@docker-server1 ~]# docker run -P docker.io/nginx #前臺啟動并隨機映射本地端口到容器的80
# 前臺啟動的會話窗口無法進行其他操作,除非退出,但是退出后容器也會退出
# 隨機端口映射,其實是默認從32768開始
# 指定端口映射:-p
# 方式1:本地端口81映射到容器80端口:
[root@docker-server1 ~]# docker run -p 81:80 --name nginx-test-port1 nginx
# 方式2:本地IP:本地端口:容器端口
[root@docker-server1 ~]# docker run -p 192.168.10.205:82:80 --name nginx-test-port2 docker.io/nginx
# 方式3:本地IP:本地隨機端口:容器端口
[root@docker-server1 ~]# docker run -p 192.168.10.205::80 --name nginx-test-port3 docker.io/nginx
# 方式4:本機ip:本地端口:容器端口/協議,默認為tcp協議
[root@docker-server1 ~]# docker run -p 192.168.10.205:83:80/udp --name nginx-test-port4 docker.io/nginx
# 方式5:一次性映射多個端口+協議:
[root@docker-server1 ~]# docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx
#查看Nginx 容器訪問日志:logs
[root@docker-server1 ~]# docker logs nginx-test-port3 #一次查看
[root@docker-server1 ~]# docker logs -f nginx-test-port3 #持續查看
# 查看容器已經映射的端口:port
[root@docker-server1 ~]# docker port nginx-test-port5
# 自定義容器名稱:--name
[root@docker-server1 ~]# docker run -it --name nginx-test nginx
# 后臺啟動容器:-d
[root@docker-server1 ~]# docker run -d -P --name nginx-test1 docker.io/nginx
# 創建并進入容器:-it
# -i: 以交互模式運行容器,通常與 -t 同時使用;
# -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
[root@docker-server1 ~]# docker run -t -i --name test-centos2 docker.io/centos /bin/bash
[root@a8fb69e71c73 /]# #創建容器后直接進入,執行exit退出后容器關閉
[root@docker-server1 ~]# docker run -d --name centos-test1 docker.io/centos
# 單次運行:
# 容器退出后自動刪除:--rm
[root@linux-docker opt]# docker run -it --rm --name nginx-delete-test docker.io/nginx
# 容器的關閉:
[root@docker-server1 ~]# docker stop f821d0cd5a99
[root@docker-server1 ~]# docker kill f821d0cd5a99
# 容器啟動和重啟
[root@docker-server1 ~]# docker start f821d0cd5a99
[root@docker-server1 ~]# docker restart f821d0cd5a99
# 容器暫停和恢復
[root@docker-server1 ~]# docker pause f821d0cd5a99
[root@docker-server1 ~]# docker unpause f821d0cd5a99
# 過濾器條件顯示
#--filter, -f:過濾器條件顯示
#name=
#status={stopped|running|paused}
[root@localhost ~]# docker ps -f name=mynginx -f status=running
#stats:動態方式顯示容器的資源占用狀態:
[root@docker-server1 ~]# docker stats
#top:查看容器資源情況
[root@docker-server1 ~]# docker top mynginx
# 批量關閉正在運行的容器:
[root@docker-server1 ~]# docker stop $(docker ps -a -q) #正常關閉所有運行中的容器
# 批量強制關閉正在運行的容器:
[root@docker-server1 ~]# docker kill $(docker ps -a -q) #強制關閉所有運行中的容器
# 批量刪除已退出容器:
[root@docker-server1 ~]# docker rm -f `docker ps -aq -f status=exited`
# 批量刪除所有容器:
[root@docker-server1 ~]# docker rm -f $(docker ps -a -q)
#指定容器DNS:
#Dns服務,默認采用宿主機的dns 地址
#一是將dns地址配置在宿主機
#二是將參數配置在docker 啟動腳本里面 –dns=1.1.1.1
[root@docker-server1 ~]# docker run -it --rm --dns 223.6.6.6 centos bash
[root@afeb628bf074 /]# cat /etc/resolv.conf
nameserver 223.6.6.6
傳遞運行命令:
容器需要有一個前臺運行的進程才能保持容器的運行,通過傳遞運行參數是一種方式,另外也可以在構建鏡像的時候指定容器啟動時運行的前臺命令。
[root@docker-server1 ~]# docker run -d centos /usr/bin/tail -f '/etc/hosts'
image.png
**使用 ** attach 命令:
- 使用方式為docker attach 容器名,attach 類似于vnc,操作會在各個容器界面顯示,所有使用此方式進入容器的操作都是同步顯示的且exit后容器將被關閉,且使用exit退出后容器關閉,不推薦使用。
使用exec命令:
[root@linux-docker opt]# docker exec -it nginx /bin/bash # 有時最后需要用sh
使用 nsenter 命令:
推薦使用此方式,nsenter命令需要通過PID進入到容器內部,不過可以使用docker inspect獲取到容器的PID:
[root@docker-server1 ~]# yum install util-linux #安裝nsenter命令
# 查看容器91fc190cb538的ip地址
[root@docker-server1 ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" 91fc190cb538
172.17.0.2
[root@docker-server1 ~]# docker inspect -f "{{.State.Pid}}" mydocker #獲取到某個docker容器的PID,可以通過PID進入到容器內
[root@docker-server1 ~]# docker inspect -f "{{.State.Pid}}" centos-test3
5892
[root@docker-server1 ~]# nsenter -t 5892 -m -u -i -n -p
[root@66f511bb15af /]# ls
# 腳本方式:
# 將nsenter命令寫入到腳本進行調用,如下:
[root@docker-server1 ~]# cat docker-in.sh
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1
#測試腳本是否可以正常進入到容器且退出后仍然正常運行:
[root@docker-server1 ~]# chmod a+x docker-in.sh
[root@docker-server1 ~]# ./docker-in.sh centos-test3
[root@66f511bb15af /]# pwd
/
[root@66f511bb15af /]# exit
logout
[root@docker-server1 ~]# ./docker-in.sh centos-test3
[root@66f511bb15af /]# exit
Logout
# 查看容器內部的hosts文件:
[root@docker-server1 ~]# docker run -i -t --name test-centos3 docker.io/centos /bin/bash
[root@056bb4928b64 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 056bb4928b64 #
#容器默認會將實例的ID 添加到自己的hosts文件
Docker 鏡像與制作
Docker 鏡像有沒有內核?
- 從鏡像大小上面來說,一個比較小的鏡像只有十幾MB,而內核文件需要一百多兆, 因此鏡像里面是沒有內核的,鏡像在被啟動為容器后將直接使用宿主機的內核,而鏡像本身則只提供相應的rootfs,即系統正常運行所必須的用戶空間的文件系統,比如/dev/,/proc,/bin,/etc等目錄,所以容器當中基本是沒有/boot目錄的,而/boot當中保存的就是與內核相關的文件和目錄。
image.png
- 由于容器啟動和運行過程中是直接使用了宿主機的內核,所以沒有直接調用過物理硬件,所以也不會涉及到硬件驅動,因此也用不上內核和驅動,另外有內核的那是虛擬機。
手動制作鏡像
- Docker制作類似于虛擬機的鏡像制作,即按照公司的實際業務務求將需要安裝的軟件、相關配置等基礎環境配置完成,然后將其做成鏡像,最后再批量從鏡像批量生產實例,這樣可以極大的簡化相同環境的部署工作。基于基礎鏡像去做,一個鏡像盡量只做一件事。
鏡像導出
- 可以將鏡像從本地導出問為一個壓縮文件,然后復制到其他服務器進行導入使用。
#導出方法1:
# docker image save IMAGE-ID ... -o /PATH/TO/SOMEFILE.tar
[root@docker-server1 ~]# docker save -o /opt/centos.tar.gz centos
[root@docker-server1 ~]# ll /opt/centos.tar.gz
-rw------- 1 root root 205225472 Nov 1 03:52 /opt/centos.tar.gz
#導出方法2:
[root@docker-server1 ~]# docker save centos > /opt/centos-1.tar.gz
[root@docker-server1 ~]# ll /opt/centos-1.tar.gz
-rw-r--r-- 1 root root 205225472 Nov 1 03:52 /opt/centos-1.tar.gz
#查看鏡像內容:
[root@docker-server1 ~]# cd /opt/
[root@docker-server1 opt]# tar xvf centos.tar.gz
[root@docker-server1 opt]# cat manifest.json #包含了鏡像的相關配置,配置文件、分層
[{"Config":"196e0ce0c9fbb31da595b893dd39bc9fd4aa78a474bbdc21459a3ebe855b7768.json","RepoTags":["docker.io/centos:latest"],"Layers":["892ebb5d1299cbf459f67aa070f29fdc6d83f40
25c58c090e9a69bd4f7af436b/layer.tar"]}]
#分層為了方便文件的共用,即相同的文件可以共用
[{"Config":"配置文件.json","RepoTags":["docker.io/nginx:latest"],"Layers":["分層1/layer.tar","分層2 /layer.tar","分層3 /layer.tar"]}]
# 鏡像導入
[root@docker-server1 ~]# scp /opt/centos.tar.gz 192.168.10.206:/opt/
# scp
#docker image load -i /PATH/TO/SOMEFILE.tar
[root@docker-server2 ~]# docker load < /opt/centos.tar.gz
# 刪除鏡像
[root@docker-server1 opt]# docker rmi centos
#獲取運行參數幫助
[root@linux-docker opt]# docker daemon –help
命令總結:
- docker load -i centos-latest.tar.xz #導入本地鏡像
- docker save -o /opt/centos.tar #centos #導出鏡像
- docker rmi 鏡像ID/鏡像名稱 #刪除指定ID的鏡像,通過鏡像啟動容器的時候鏡像不能被刪除,除非將容器全部關閉
- docker rm 容器ID/容器名稱 #刪除容器
- docker rm 容器ID/容器名-f #強制刪除正在運行的容器
# 提交為鏡像:
# 基于容器制作鏡像
# 修改原有基礎鏡像啟動要運行的命令
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
#Options:
# -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
# -c, --change list Apply Dockerfile instruction to the created image
# -m, --message string Commit message
# -p, --pause Pause container during commit (default true)
[root@docker-server1 ~]# docker commit -a "wsl" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 myhub/httpd:v0.1-2
# 提交鏡像,修改默認運行的命令
[root@docker-server1 ~]# docker commit --change='CMD ["httpd", "-h /data/httpd/htdocs“, “-f”]' -c "EXPOSE 80" bbox1 myhub/busybox/httpd:v0.1
# 提交的時候標記tag號:
# 標記tag號,生產當中比較長用,后期可以根據tag標記啟動不同版本啟動image啟動
[root@docker-server1 ~]# docker commit -m "nginx image" f5f8c13d0f9f jack/centos-nginx:v1
sha256:ab9759679eb586f06e315971d28b88f0cd3e0895d2e162524ee21786b98b24e8
# 從自己鏡像啟動容器:
[root@docker-server1 ~]# docker run -d -p 80:80 --name my-centos-nginx jack/centos-nginx /usr/sbin/nginx
ce4ee8732a0c4c6a10b85f5463396b27ba3ed120b27f2f19670fdff3bf5cdb62
將鏡像push到Docker Hub
?docker push
? Push images to Docker Cloud or private registry
?推送鏡像到Docker Hub的前提是于Docker Hub有用戶賬號,且鏡像標簽格式為“$DOCKER_USER_ID/IMAGE”
?使用docker login命令登錄成功后,即可使用docker push命令進行推送
?示例
? ~]# docker push mageedu/busybox/httpd:version0.1
默認情況下Docker的存放位置為:/var/lib/docker
可以通過下面命令查看具體位置:
sudo docker info | grep "Docker Root Dir"
如果docker是1.12或以上的版本,可以修改(或新建)daemon.json文件。修改后會立即生效,不需重啟docker服務。
vim /etc/docker/daemon.json
{"graph": "/new-path/docker"}