docker基本使用
阿新 • • 發佈:2021-10-25
安裝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