# 映象 docker pull 名字:標籤 docker images docker rmi 映象id --------- docker push 本地映象 # 把本地映象推送到自己倉庫 # 容器:映象執行起來成為一個個容器,一個容器,就當成是一個虛擬機器裝了個作業系統 docker ps docker ps -a docker stop 容器id docker start 容器id docker rm 容器id
# run :執行容器 -如果容器不存在,會先建立再執行 -create 容器,run執行 - 建立並執行容器 # 執行一個centos7容器 docker run -id --name=容器名字 映象:標籤 # 建立並執行容器,命令列在宿主機上 docker run -it --name=容器名字 映象:標籤 #建立並執行容器,命令列在容器內部 #### 容器要執行,內部必須有個前臺程序阻塞,否則容器就會停掉### #1 docker run 把映象執行成容器 -docker run 引數 -i 表示執行容器 -d 以守護式容器在後臺執行,用這個引數建立出來的容器,命令列還在宿主機上,沒有進入到容器內部 -t 表示容器啟動後會進入容器命令列。加入這引數後,容器建立就能登入進去。即分配一個偽終端。 --name 指定容器名字,如果不指定,會隨機一個名字 -p 表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映 -v 表示目錄對映關係(前者是宿主機目錄,後者是容器的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上 # 2 案例 -id docker run -id --name=centos centos:7 # 執行完,命令在宿主機上,可以透過命令檢視正在執行的容器 # 3 案例 -it docker run -it --name=centos centos:7 # 執行完,命令列在容器內,容器很乾淨,幾乎啥軟體都沒有,可以exit退出到宿主機---》只要退出,容器就停了 # 4 建立一個python3.9容器---》不進入 docker run -id --name=python python:3.9 # 5 啟動一個centos容器並且進入,名字叫mycentos,在內部裝個vim,然後退出 1 docker run -id --name=mycentos centos:centos7 2 在宿主機 3 docker exec -it mycentos /bin/bash # 新開了一個bash程序 4 yum install vim -y 5 exit 6 容器停還是沒有停?沒有,因為容器執行時的 bash 程序沒有結束 # 6 重點: 如果建立容器並進入---》只要退出---》容器就停了 容器要執行,必須有個前臺程序在執行,並且是夯住(阻塞)的,否則容器就停了 # 7 進入到容器內部 # 在容器上執行命令 docker exec 容器名字/id 命令 # 利用這個特性-->進入到容器內部 docker exec -it 容器名字/id /bin/bash docker exec -it python sh # 退出,結束掉 /bin/bash exit
-v
# 一次性刪除所有容器 docker rm `docker ps -a -q` # 一次性刪除所有映象 docker rmi `docker images -q` ################### # 執行出一個 centos77 容器,不進入, 做目錄對映 # 把宿主機的 /root/lqz資料夾 對映到 容器內部的 /lqz資料夾 # -v可以寫多個,可以是檔案或資料夾 1 cd # 回家 前提是你是root使用者 2 mkdir lqz # 在root目錄下建立lqz資料夾 3 執行容器,做目錄對映 docker run -id --name=centos77 -v /root/lqz:/lqz centos:centos7 4 在宿主機的 /root/lqz 下新建 xx.txt vim xx.txt 5 來到容器內部:看這個檔案在不在 cat xx.txt 6 他們是相互影響的: 容器內部修改檔案---》會影響外部 外部修改檔案---》影響內部 # 目錄對映好處是,後期咱們部署django專案 1 有個django容器,做好對映,程式碼放在宿主機上即可,以後更新了程式碼,只要重啟容器,程式碼就是最新了 2 執行mysql容器---》mysql配置檔案,資料data目錄,放在宿主機上做好對映 如果 mysql容器---》表資料,放到容器中---》如果刪了容器---》資料庫全沒了 表資料,放在宿主機上---》把容器刪除---》表資料還在----》再啟動一個容器做好對映---》資料都還在
-p
# -p引數:埠對映 容器中啟動一個mysql5.7 --》容器中的3306監聽,宿主機3306沒人監聽,做埠對映後,宿主機的3306就被docker的這個容器監聽了 # 啟動的mysql的root密碼是123456 # 啟動mysql容器 -p 宿主機埠:容器埠 # 以後臺守護程序執行mysql容器,mysql的root使用者密碼是123456,宿主機和容器做了埠對映 docker run -id --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # netstat -nlp |grep 3307 檢視本機80埠占用情況 # 檢視宿主機 3307埠占用情況 yum install net-tools -y netstat -nlp | grep 3307 # 被docker佔了 # 以後訪問宿主機3307埠就等於訪問容器的3306埠 # win機器可以遠端連結 mysql -命令列連結:mysql -h 10.0.0.110 -P 3307 -uroot -p -Navicate: 連結,建立lqz資料庫 -python: # 宿主機--》進入到容器內部--》進入到mysql,檢視有沒有建立lqz這個庫 docker exec -it mysql5.7 /bin/bash # 進入容器內部 mysql -uroot -p # 進入mysql show databases; # 檢視所有資料庫
# 啟動容器 docker start 容器id # 停止容器 docker stop 容器id ### mysql的容器底層的作業系統是 debian 裝軟體需要用 apt-get update apt-get install vim -y # 檔案複製(宿主機執行) # 容器的檔案copy到宿主機上(不是在容器內執行) docker cp 容器名稱:容器目錄 需要複製的檔案或目錄 docker cp 0a9633190cb9:/xx.txt /root/lqz/lqz.txt # 宿主機的檔案copy到容器中 docker cp 需要複製的檔案或目錄 容器名稱:容器目錄 docker cp /root/lqz/xx.txt 0a9633190cb9:/xx.txt # 檢視容器IP地址 docker inspect 容器名稱 # 檢視容器的詳細描述,很多 docker inspect 0a9633190cb9 --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID) # 在多個容器之間是可以ping通的(容器和宿主機也可以) # python:172.17.0.3 # mysql5.7:172.17.0.2 # 宿主機--》ping 它倆 # 容器--》容器 apt-get install iputils-ping ping 172.17.0.2 # 刪除容器(刪除已停止的容器) docker rm 容器id docker rm `docker ps -a -q` # 無狀態的服務(在容器中儘量執行無狀態的服務) -mysql reids 有狀態,執行過程中產生資料,儲存,容器刪除,資料就沒了 -uwsgi+django 無狀態的服務 # 補充 1 ip地址 ip 10.0.0.110 10.0.0.111 10.0.0.1 10.0.110.1 2 子網掩碼 mask 255.255.0.0 3 閘道器 gatway 10.0.0.1
# dokcer 中部署mysql,以後不需要在宿主機上裝mysql #1 沒有做目錄對映---》配置檔案--》表資料都在容器中---》一旦刪除--》所有都沒了 docker run -di --name=mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # 2 做目錄(配置檔案和資料檔案)和埠對映 # 做目錄對映:data檔案,配置檔案 # 建立資料夾 mkdir /mysql mkdir /mysql/conf.d mkdir /mysql/data/ vim /mysql/my.cnf [client] default-character-set=utf8 [mysqld] user=mysql character-set-server=utf8 default_authentication_plugin=mysql_native_password secure_file_priv=/var/lib/mysql expire_logs_days=7 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION max_connections=1000 docker run -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # 建立庫,建立表,插入資料 # 關閉容器,刪除容器,myslq的容器沒了,但是資料在宿主機上放著 docker stop mysql2 docker rm mysql2 ##docker rm mysql -f 容器之間刪了 # 再執行起一個容器,做好目錄對映,資料都回來了 docker run -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 拉取redis映象 docker pull redis #最新 mkdir /root/data vim /root/redis.conf bind 0.0.0.0 daemonize NO protected-mode yes requirepass 123456 # 執行 #啟動容器時,執行的命令是什麼 redis-server /etc/redis/redis.conf docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis redis-server /etc/redis/redis.conf # 在容器執行時,可以自己定製執行命名 舉例:docker run -id centos:centos7 ls # 遠端連結redis操作
# 拉取nginx映象 docker pull nginx # run起容器 # docker run -id --name nginx -p 80:80 nginx # /usr/share/nginx/html docker run -id --name nginx1 -p 8088:80 -v /root/html:/usr/share/nginx/html nginx # 以後只需要修改宿主機的/root/html 路徑,看到頁面就是修改後的
# 映象從哪來的? 1 docker pull 拉的 2 透過容器打包成映象 -centos映象執行成容器---》裝了vim -把裝了vim的容器---》打包成映象 -以後拿到這個映象--》再執行成容器,都會帶vim命令 3 Dockerfile構建 # 容器儲存為映象 -執行一個centos容器 docker run -id --name centos_vim centos:centos7 -在容器中裝vim docker exec -it a6e240 /bin/bash yum install vim -y -把容器做成映象(centos+vim) docker commit centos_vim centos_vim_image -把centos_vim 容器刪除 docker rm centos_vim -f -基於新構建的映象,執行成容器 docker run -id --name centos_vim centos_vim_image:latest -進入到容器中,檢視,軟體都在 docker exec -it c3e633bd1 /bin/bash # 本地映象---推送到遠端docker倉庫中---》私有倉庫 -早期 這個是免費的---》後期好像收費 -給映象打個tag docker tag 映象id 映象新名字(賬號名/映象名) -登入到你賬號中 docker login 輸入賬號密碼 -docker push 映象名字 docker push 映象新名字 -別人就可以下載了 # 映象備份和恢復 docker save -o centos_vim_image.tar centos_vim_image -刪除容器,刪除映象 -把備份的映象恢復 docker load -i centos_vim_image.tar
# 映象從哪裡來的? 1 遠端倉庫拉取的 docker pull (hub.docker---》搭建私有倉庫) 2 用容器做成的映象 docker commit 3 把備份的恢復 docker load 4 使用Dockerfile來構建(這種多) # 什麼是Dockerfile Dockerfile是由一系列命令和引數構成的指令碼檔案,這些命令應用於基礎映象並最終建立一個新的映象 # centos7中,裝了vim,在根路徑下新建了一個檔案 lqz.txt,寫了寫內容 # Dockerfile的命令 FROM 基礎映象 #基於哪個基礎映象來構建 MAINTAINER lqz # 宣告映象的建立者 ENV key value # 設定環境變數 (可以寫多條) RUN command #是Dockerfile的核心部分(可以寫多條) ADD source_dir/file dest_dir/file #將宿主機的檔案複製到映象內,如果是一個壓縮檔案,將會在複製後自動解壓 COPY source_dir/file dest_dir/file # 和ADD相似,但是如果有壓縮檔案並不能解壓 WORKDIR lqz # 設定工作目錄,執行起這個容器,來到的路徑就是這個路徑
# 構建一個帶vim的centos:7映象,根路徑下有/lqz/ss.py vim Dockerfile FROM centos:7 MAINTAINER lqz ENV name lqz RUN yum install vim -y RUN mkdir /lqz RUN touch /lqz/ss.py RUN echo 'print(1)' > /lqz/ss.py COPY ./aa.txt /lqz/aa.txt WORKDIR /lqz # 基於dockerfile構建映象,不要忘了 . 基於當前路徑下的Dockerfile 構建降序 docker build -t='centos_lqz_vim' . docker images # 基於這個映象執行容器 docker run -id --name xx centos_lqz_vim # 進入到容器 docker exec -it xx /bin/bash # 驗證vim,和資料夾,檔案是否存在
# https://zhuanlan.zhihu.com/p/419175543?utm_id=0 FROM: 指定基礎映象 RUN: 構建映象過程中需要執行的命令。可以有多條。docker build CMD:新增啟動容器時需要執行的命令。多條只有最後一條生效。可以在啟動容器時被覆蓋和修改 ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。 MLABELAINTAINER:表明映象的作者。將被遺棄,被LABEL代替。 EXPOSE:設定對外暴露的埠。 ENV:設定執行命令時的環境變數,並且在構建完成後,仍然生效 ARG:設定只在構建過程中使用的環境變數,構建完成後,將消失 ADD:將本地檔案或目錄複製到映象的檔案系統中。能解壓特定格式檔案,能將URL作為要複製的檔案 COPY:將本地檔案或目錄複製到映象的檔案系統中。 VOLUME:新增資料卷 USER:指定以哪個使用者的名義執行RUN, CMD 和ENTRYPOINT等命令 WORKDIR:設定工作目錄 # docker logs 容器名字/id號 檢視映象執行成容器時,錯誤日誌 # CMD ENTRYPOINT #相同點: 只能寫一條,如果寫了多條,那麼只有最後一條生效。 容器啟動時才執行,執行時機相同。 # 不同點: ENTRYPOINT不會被執行的command覆蓋,而CMD則會被覆蓋。 如果我們在Dockerfile中同時寫了ENTRYPOINT和CMD,並且CMD指令不是一個完整的可執行命令,那麼CMD指定的內容將會作為ENTRYPOINT的引數 # 案例Dockerfile FROM centos:7 ARG age=19 # 一定要等於 RUN echo $age CMD /bin/bash # docker build -t='xxxx' .
# 以圖書管理系統為例---》公司使用docker流程 # 公司中,使用Docker開發的工作流程 第一步:有一個專案,pycharm開發著,開發完後 第二步:在專案路徑下新建Dockerfile,寫入 FROM python:3.8 MAINTAINER lqz WORKDIR /soft COPY ./requirements.txt /soft/requirements.txt RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple CMD ["python","manage.py","runserver","0.0.0.0:8080"] 第三步:把程式碼提交到git ------------------ 第四步:上線人員:在上線機器上,把程式碼啦下來 git clone https://gitee.com/liuqingzheng/books.git 第五步:構建映象 docker build -t='django_books' . 第六步:執行容器 docker run -id --name=books -v /root/lqz/books:/soft -p 8080:8080 django_books:latest 第七步:其它人訪問宿主機的8080埠就能看到專案了 --------- 第八步:開發人員繼續提交程式碼 第九步:運維人員pull程式碼,重啟容器,使用者就可以看到最新的了 重啟docker容器即可(第三方依賴變了)--》重寫構建映象,執行容器
https://zhuanlan.zhihu.com/p/623811065