docker 安裝與常用命令

一、安裝與啓動

硬件環境:4C8G 物理機

系統環境:

[root@dev216 ~]# uname -r
3.10.0-957.el7.x86_64
[root@dev215 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

直接安裝

[root@dev216 ~]# yum install docker

可能出現的問題:

問題一,yum 中的 python 與系統中的不匹配

-bash: /usr/bin/yum: /usr/bin/python2.7.5: bad interpreter: No such file or directory

這是因爲有人動了環境裏的 python,查看 python

[root@dev216 ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python.bak /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz

修改 yum 中的 python 引用(或者直接備份 python,將 python2.7 改爲 python)

[root@dev216 ~]# vim /usr/bin/yum#!/usr/bin/python
改爲
#!/usr/bin/python2.7

問題二,還是 python 引用的問題

[root@dev216 ~]# yum install docker
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
 * base: mirrors.huaweicloud.com
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.bfsu.edu.cn
base                                                                                               | 3.6 kB  00:00:00     
extras                                                                                             | 2.9 kB  00:00:00     
updates                                                                                            | 2.9 kB  00:00:00     
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
                  ^
SyntaxError: invalid syntax
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
                  ^
SyntaxError: invalid syntax
Exiting on user cancel

修改 / usr/libexec/urlgrabber-ext-down

vim /usr/libexec/urlgrabber-ext-down
將 
#!/usr/bin/python
改爲
#!/usr/bin/python2.7

啓動 docker

systemctl start docker.service

二、docker 操作

啓動與狀態(centos7)

#啓動、停止、重啓
systemctl start/stop/restart docker
# 查看docker的運行狀態,active(運行)inactive(死亡)
[root@dev216 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-07-08 16:27:31 CST; 1min 29s ago
     Docs: http://docs.docker.com
 Main PID: 27805 (dockerd-current)
    Tasks: 25
   CGroup: /system.slice/docker.service
           ├─27805 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default...
           └─27813 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --...
Jul 08 16:27:30 dev216 dockerd-current[27805]: time="2021-07-08T16:27:30.088468818+08:00" level=info msg="libconta...7813"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.157415965+08:00" level=info msg="Graph mi...onds"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.158454396+08:00" level=info msg="Loading ...art."
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.166785370+08:00" level=info msg="Firewall...alse"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.246307425+08:00" level=info msg="Default ...ress"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.275860687+08:00" level=info msg="Loading ...one."
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.293321663+08:00" level=info msg="Daemon h...tion"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.293354473+08:00" level=info msg="Docker d....13.1
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.298513884+08:00" level=info msg="API list...sock"
Jul 08 16:27:31 dev216 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.

docker 信息

# 查看docker容器help,可以快速瞭解有哪些命令
docker --help
# 查看docker容器版本,包含客戶端、服務端的版本信息
docker version
# 查看docker容器信息,包含version和操作系統,硬件配置等
docker info
docker debug 
# 設置日誌級別,默認info級別,包含"debug", "info", "warn", "error", "fatal"
docker --log-level info

三、鏡像操作

鏡像遠程操作

# 登錄賬戶
docker login
# 鏡像搜索 ,可選參數:
#  --filter 或 -f 過濾條件 -f=stars=50只顯示starts>50的鏡像
#  --no-trunc 顯示鏡像的完整描述
#  --limit int 一頁顯示幾條,默認25條
# --automated 過濾automated=ok的,提示已過期,讓用filter,使用卻不行
docker search [-f=stars=50 --no-trunc] mysql
# 鏡像拉取,-a 可選,表示全tag拉取,latest表示要拉取的鏡像tag
docker pull [-a] mysql:latest
# 將鏡像推送到遠程倉庫,將tag爲yxkong的mysql鏡像推送到遠程倉庫
docker push mysql:yxkong

示例

[root@dev216 ~]# docker search -f=stars=50 --automated  python
Flag --automated has been deprecated, use --filter=automated=true instead
INDEX       NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/kaggle/python                    Docker image for Python scripts run on Kaggle   155                  [OK]
docker.io   docker.io/nikolaik/python-nodejs           Python with Node.js                             77                   [OK]
docker.io   docker.io/joyzoursky/python-chromedriver   Python with Chromedriver, for running auto...   58                   [OK]

鏡像本地操作

# 列出本地images,-a(顯示所有) -f(過濾) -q(只顯示鏡像id)
# 不加mysql顯示所有,加mysql只顯示mysql的
docker images mysql
# 顯示指定鏡像的提交記錄, -H 默認爲true;-q(只顯示鏡像id)
docker history mysql
# 刪除本地鏡像 -f 強制刪除,後面可以刪除一個或多個
docker rmi redis mysql
# 刪除本地全部鏡像
docker rmi -f $(docker images -q)
# 鏡像打包成tar,將redis 4.2tag的鏡像打包成redis4.2.tar
dcoker save -o redis4.2.tar redis:4.2
# 從tar包載入鏡像
docker load -i redis4.2.tar
# 給某個鏡像打tag
docker tag
# 構建鏡像 指定dockerfile構建指定tag的鏡像
docker build -f /docker/dockerfile/yxk_mysql -t yxk_mysql:yxkong

四、容器操作

容器啓動

# 包含兩步,將鏡像放入容器,再啓動容器
docker run -it --name yxk_redis redis
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
options 
-i 以交交互的模式運行容器 通常和-t一起使用
-t 爲容器分配一個終端,通常和-i一起使用
-d 後臺運行容器(類似於nohup)並返回一個容器id
-a 指定標準輸入輸出內容類型STDIN/STDOUT/STDERR,默認[]
-p 指定端口映射,格式爲 主機:主機端口:容器端口
--name 爲容器指定一個名稱
--dns 指定容器使用的dns,默認和宿主一樣
-h 指定容器的hostname
--cpuset="0-2"  or --cpuset="0,1,2": 綁定容器到指定CPU運行;
-e 設置環境變量
--env-file=[]: 從指定文件讀入環境變量;
-m 設置容器的最大內存
--expose=[]: 開放一個端口或一組端口;
--volume , -v: 綁定一個卷
# 只是啓動容器或重啓容器
docker start/restart yxk_redis

容器查看

##top支持 ps 命令參數,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
##列出yxk_redis容器中運行進程,不加容器名就所有
docker top yxk_redis
##查看所有運行容器的進程信息
for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
##查看redis容器日誌,默認參數
docker logs yxk_redis
##查看redis容器日誌,參數:-f  跟蹤日誌輸出;-t   顯示時間戳;--tail  僅列出最新N條容器日誌;
docker logs -f -t --tail=20 yxk_redis
##查看容器redis從2021年07月08日後的最新10條日誌。
docker logs --since="2021-07-08" --tail=10 yxk_redis
# 查看當前運行的容器,
# 參數:-a 查看全部容器(包含正在運行和歷史運行過的)
#  -q 查看正在運行容器的id -s 查看運行容器總文件大小
# -l 顯示最近創建容器 -n 3 顯示最近創建的3個容器  --no-trunc 不中斷輸出
docker ps -qs yxk_redis
# 獲取鏡像yxk_redis的元信息
docker inspect yxk_redis
# 獲取正在運行的容器yxk_redis的 IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' yxk_redis

容器的進出

# 使用run方式在創建時進入
docker run -it centos /bin/bash
# 關閉容器並退出
exit
# 僅退出容器,不關閉
快捷鍵:Ctrl + P + Q
# 直接進入centos 容器啓動命令的終端,不會啓動新進程,多個attach連接共享容器屏幕,參數:--sig-proxy=false  確保CTRL-D或CTRL-C不會關閉容器
docker attach --sig-proxy=false centos 
# 在 centos 容器中打開新的交互模式終端,可以啓動新進程,參數:-i  即使沒有附加也保持STDIN 打開;-t  分配一個僞終端
docker exec -i -t  centos /bin/bash
# 以交互模式在容器中執行命令,結果返回到當前終端屏幕
docker exec -i -t centos ls -l /tmp
# 以分離模式在容器中執行命令,程序後臺運行,結果不會反饋到當前終端
docker exec -d centos  touch cache.txt

**容器的操作與刪除
**

# 停止一個運行中的容器
docker stop yxk_redis
# 殺掉一個運行中的容器
docker kill yxk_redis
# 刪除一個已停止的容器
docker rm yxk_redis
# 刪除一個運行中的容器
docker rm -f yxk_redis
# 刪除多個容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
# -l 移除容器間的網絡連接,連接名爲 db
docker rm -l db 
# -v 刪除容器,並刪除容器掛載的數據卷
docker rm -v yxk_redis

容器與主機間的數據交互

# 將yxk_redis容器中的文件copy至本地路徑
docker cp yxk_redis:/[container_path] [local_path]
# 將主機文件copy至yxk_redis容器
docker cp [local_path] rabbitmq:/[container_path]/
# 將主機文件copy至yxk_redis容器,目錄重命名爲[container_path](注意與非重命名copy的區別)
docker cp [local_path] yxk_redis:/[container_path]

所有的 docker 命令都可以通過以下方式獲取詳細說明

docker 命令   --help 會有各種參數d的詳細shuo'm
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/NDNDp55o1LSn84blH0sxzw