1. 程式人生 > 其它 >docker基本使用

docker基本使用

安裝Docker

#docker分為企業版和社群版
	企業版	: docker 
	社群版	: docker-ce 

#安裝依賴
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

#安裝阿里雲源倉庫
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@docker ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

#檢視docker版本
[root@docker ~]# yum list docker-ce --showduplicates | sort -r

#選擇最新的19版本,進行安裝
[root@docker ~]# yum install -y docker-ce-19.03.9

[root@docker ~]# mkdir /etc/docker
[root@docker ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://dp0vxr93.mirror.aliyuncs.com"]
}

[root@docker ~]# systemctl daemon-reload

[root@docker ~]# systemctl start docker

映象

1.什麼是映象

#用來啟動容器的模板,映象一般是存在映象倉庫中的。

#映象倉庫地址:https://hub.docker.com/search?type=image

#倉庫分為三種:
 -- 官方倉庫:	hub.docker.com
 -- 第三方倉庫:  https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
 -- 自建倉庫:    hao
 

2.映象的相關命令

1)搜尋映象

[root@docker ~]# docker search centos
  NAME        DESCRIPTION      				 STARS     OFFICIAL    AUTOMATED
映象的名稱     該映象的介紹      				收藏量	    官方  		 自建
centos       The official build of CentOS.     6809      [OK]

2)下載映象

[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
				
#映象名稱的構成:
#docker.io  /library       /centos    :latest
[倉庫URL]/[倉庫的名稱空間]/[倉庫的名稱]:[映象的版本號]
預設的倉庫URL:docker.io
預設的倉庫名稱空間:library
倉庫的名稱:沒有預設
映象版本號:預設是latest

3)檢視本地映象列表

docker images 或者 docker image ls

[root@docker ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   5 weeks ago   231MB
				
REPOSITORY:[倉庫URL]/[倉庫的名稱空間]/[倉庫的名稱]
TAG	: 版本號
IMAGE ID : 縮寫版的映象ID
CREATED	:建立該容器到現在的時間
SIZE	:映象大小
				
[root@docker ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   5 weeks ago   231MB

4)檢視映象的詳情

  docker inspect [映象名稱或ID]
 
 [root@docker ~]# docker inspect centos

5)更改映象名稱

  docker tag [原來的名稱] [新名稱]
  
[root@docker ~]# docker tag centos test
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   5 weeks ago   231MB
test         latest    5d0da3dc9764   5 weeks ago   231MB

6)上傳映象

#將映象上傳至遠端倉庫。
1、登入倉庫
[root@docker ~]# docker login --username=zzcwep registry.cn-hangzhou.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
	
2、修改映象名稱	
[root@docker ~]# docker tag  registry.cn-hangzhou.aliyuncs.com/k8sos/centos:latest
	
3、上傳映象
docker push [倉庫URL]/[倉庫的名稱空間]/[倉庫的名稱]:[版本號]
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/kubernetes-zzc/centos:latest


7)登陸倉庫

docker login [倉庫URL]
倉庫URL預設是:docker.io

8)刪除映象

 docker rmi [倉庫的名稱ID]		
#引數:
  -f : 強制刪除映象。

[root@docker ~]# docker rmi centos
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59

[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    87a94228f133   13 days ago   133MB


9)清理映象

使用一段時間之後,docker會產生很多臨時檔案,以及一些沒有被使用的映象, 我們可以通過
 docker image prune 命令來進行清理。
#引數:
 -a :刪除所有無用的映象,不光是臨時映象。
 -f :強制刪除映象,而不進行提示。
 
 

10)檢視映象的歷史

[root@docker ~]# docker history centos
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
5d0da3dc9764   5 weeks ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      5 weeks ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      5 weeks ago   /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0…   231MB

容器的使用

1)檢視本機容器列表

docker ps # 檢視本機容器列表

[root@docker ~]# docker ps
CONTAINER ID   IMAGE          COMMAND             CREATED  		 STATUS       PORTS      NAMES
 容器的ID		映象         容器的啟動命令        容器的建立時間   容器的狀態    容器的埠  容器的名稱
e4c4fc806516   nginx    "/docker-entrypoint.…"   3 days ago      Up 3 days      80/tcp    nginx

STATUS:
UP : 		啟動狀態
Exited :	停止狀態
Created :  容器已經建立,當時沒有啟動

#引數:
 -a : 檢視系統上所有的容器(包含未啟動)
 -q : 只顯示容器ID

2)建立容器

docker run		# docker run是建立並啟動容器
docker create 	# docker create是建立容器

docker create 中的引數跟 docker run 類似 主要其本身的功能不同。

-- docker run 
#格式:
docker run [引數] 映象  [啟動命令]

引數和啟動命令可以省略。

容器的啟動流程:
1.檢視本地是否存在正在使用的映象。
2.如果本地不存在使用的映象,則去倉庫下載
3.根據映象來啟動容器

#引數:
-d 	: 以守護程序方式執行容器。
--name : 自定義容器的名稱
-p 		: 指定一個埠對映
-P		:隨機一個埠對映
-i		: 開啟標準輸出
-t		:建立一個終端
-e		:在容器內部增加一個環境變數
-h		: 指定一個主機名(預設的主機名是容器的縮寫版ID )
-v 		: 指定一個掛載卷(將宿主主機的目錄掛載到容器內,從而實現檔案互通)
--network	: 連結一個網橋
--link		: 連結一個容器

[root@docker ~]# docker run -d --name nginx nginx 
98af232aad448625f721b13ed47fd0d229f9b535dad2bd3b3d5e7c08fff8b3da


3)啟動容器

docker start [容器的名稱|ID]

[root@docker ~]# docker start nginx
nginx

4)停止容器

docker stop [容器的名稱|ID]

[root@docker ~]# docker stop nginx
nginx

5)刪除容器

docker rm [容器的名稱|ID]
docker rm -f [容器的ID或名稱]
		
#案例:
刪除所有容器:[root@docker ~]# docker rm -f $(docker ps -a -q)
		

6)檢視容器詳細狀態

docker inspect [容器的ID或名稱]

#案例:
[root@docker ~]# docker inspect nginx
[
    {
        "Id": "510bfd90e47641e930c16b2a069be333be9814f852b549ce0bf270e4e2f4071d",
        "Created": "2021-10-25T11:21:57.638679917Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 11103,
            "ExitCode": 0,
-------- ------- -----------  省略  -  - ---------------------- -------------

#要求判斷指定容器是否正在執行?

[root@docker ~]# docker inspect -f '{{ .State.Running }}' 510bfd90e476
true

7)複製容器中的內容

1、將容器內的檔案複製到宿主主機

docker cp [容器的ID或名稱]:[檔案路徑]  宿主主機路徑

[root@docker ~]# docker exec nginx ls /etc/nginx
conf.d
fastcgi_params
mime.types
modules
nginx.conf
scgi_params
uwsgi_params

[root@docker ~]# docker cp nginx:/etc/nginx/nginx.conf /root
[root@docker ~]# ll
total 12
-rwxrwxr-x. 1 root root 1202 2021-10-12 10:03 docker-entrypoint.sh
-rw-r--r--. 1 root root  497 2021-10-09 12:06 hostname_ip.sh
-rw-r--r--. 1 root root  648 2021-09-07 23:38 nginx.conf


2、將宿主主機上的內容複製到容器

docker cp [宿主主機路徑] [容器的ID]:[檔案路徑]

[root@docker ~]# docker cp /root/hostname_ip.sh nginx:/root

[root@docker ~]# docker exec nginx ls /root
hostname_ip.sh

8)進入容器

1、attach
attach是進入容器,原理是將容器內的PID為1的程序開闢一個管道,連結到宿主主機。
當在宿主主機上退出時,容器也隨即退出(結束了生命週期)


2、exec(推薦)
exec其本質是在宿主主機上執行一個容器內的命令,但是加上-it引數,可以達到進入容器的效果,其原理是在容器內部新建立一個bash程序。所以當exec退出時不影響容器的正常執行。

#在宿主主機上執行一個容器內部的命令
docker exec [容器的ID或名稱] [需要在容器內部執行的名]

[root@docker ~]# docker exec nginx nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


docker exec -it [容器的名稱] [進入容器執行的命令]
[root@docker ~]# docker exec -it nginx bash

root@510bfd90e476:/# ls
bin   docker-entrypoint.d   home   media  proc	sbin  tmp
boot  docker-entrypoint.sh  lib    mnt	  root	srv   usr
dev   etc		    lib64  opt	  run	sys   var


			

3、nsenter			
nsenter的原理是建立一個管道程序,連結到容器的內部。
nsenter --target $( docker inspect -f '{{.State.Pid }}'  ) --mount --uts --ipc --net --pid
[root@docker ~]# nsenter --target $( docker inspect -f '{{.State.Pid }}' centos ) --mount --uts --ipc --net --pid


4、ssh的方式(及其不推薦)

9)使用 save 和 load儲存映象

1、儲存映象(針對點是映象)
docker save # 將映象儲存成壓縮包

#引數:
-o :輸出到的檔案
[root@docker ~]# docker save nginx -o image.tar


[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    87a94228f133   13 days ago   133MB
centos       latest    5d0da3dc9764   5 weeks ago   231MB

# docker save [映象名稱|ID] > 壓縮包名稱
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

[root@docker ~]# docker save nginx > image.tar
[root@docker ~]# ll
total 134332
-rwxrwxr-x. 1 root root      1202 2021-10-12 10:03 docker-entrypoint.sh
-rw-r--r--. 1 root root       497 2021-10-09 12:06 hostname_ip.sh
-rw-r--r--. 1 root root 137544192 2021-10-25 19:40 image.tar

#儲存多個映象
# docker save [映象名稱|ID] [映象名稱|ID] > 壓縮包名稱
[root@docker ~]# docker save nginx centos > docker.tar

2. 匯入映象包針對與save使用
# docker load # 將映象包匯入本地映象中

[root@docker ~]# docker load -i docker.tar
[root@docker ~]# docker load < docker.tar

10)使用 export 和 import

1、儲存容器為映象(針對點是容器)
docker export  #將容器打包成映象
#引數:
-o :輸出到的檔案

[root@docker ~]# docker export 2cea8378bc86 > nginx.tar
[root@docker ~]# ll
total 132600
-rwxrwxr-x. 1 root root      1202 2021-10-12 10:03 docker-entrypoint.sh
-rw-r--r--. 1 root root       497 2021-10-09 12:06 hostname_ip.sh
-rw-r--r--. 1 root root 135770624 2021-10-25 20:06 nginx.tar


2、docker import #將映象包匯入本地映象中
 
[root@docker ~]# docker import nginx.tar nginx:v1
sha256:8048cab7ea12874922dcb063b55b4525eb51e71ed36aec1df679ba0849be21c2

[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        v1        8048cab7ea12   6 seconds ago   132MB
nginx        latest    87a94228f133   13 days ago     133MB
centos       latest    5d0da3dc9764   5 weeks ago     231MB

11)將容器儲存成本地映象

#主要格式:docker [container id] commit  [容器名稱|ID] 
#主要引數:
-a	作者資訊
-m	提交資訊
-p	提交時,暫停容器執行

docker commit 

docker commit -a "ShanHe" -m "這是一個弟弟" -p  nginx   nginx:v2

12)檢視容器的執行日誌

docker logs [容器的ID或名稱]
#引數:
-f : 持續監控

[root@docker ~]# docker logs nginx 
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/10/25 12:15:31 [notice] 1#1: using the "epoll" event method
2021/10/25 12:15:31 [notice] 1#1: nginx/1.21.3
2021/10/25 12:15:31 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 
2021/10/25 12:15:31 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64
2021/10/25 12:15:31 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/10/25 12:15:31 [notice] 1#1: start worker processes
2021/10/25 12:15:31 [notice] 1#1: start worker process 30

13)暫停容器和重新執行容器

#容器將暫停服務
	docker pause [容器名稱|ID]
	

#重新執行容器,恢復提供和服務
	docker unpause [容器名稱|ID]
	

14)用容器搭建一個小遊戲

1、程式碼(宿主主機)
[root@docker ~]# rz mario.zip
[root@docker ~]# mkdir /code
[root@docker ~]# mv mario.zip /code
[root@docker ~]# cd /code
[root@docker /code]# unzip mario.zip	
[root@docker /code]# ll
total 148
drwxr-xr-x. 3 root root    118 2014-11-07 21:42 html5-mario
-rw-r--r--. 1 root root 148142 2021-10-22 17:02 mario.zip

2、將目錄掛載到容器
- v

3、對映埠
			
[root@docker /code]# docker run -d --name mario -v /code/html5-mario:/usr/share/nginx/html -p 8080:80  nginx

			
4、瀏覽器瀏覽
10.0.0.71:8080