Docker的基礎命令及鏡像制作

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.conf

docker-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"}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容