docker_02days

拆尼斯、帕丁顿發表於2024-03-13
# 映象
	docker pull 名字:標籤
    docker images
    docker rmi 映象id
    ---------
    docker push 本地映象 # 把本地映象推送到自己倉庫
    
# 容器:映象執行起來成為一個個容器,一個容器,就當成是一個虛擬機器裝了個作業系統
	docker ps
    docker ps -a
    docker stop 容器id
    docker start 容器id
    docker rm 容器id
    

容器操作

run

# 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

應用部署

mysql 部署

# 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部署

# 拉取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部署

# 拉取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

Dockerfile

dockerfile介紹和常用命令

# 映象從哪裡來的?
	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' . 

dockerfile構建一個djagno專案(books圖書管理系統)

 

# 以圖書管理系統為例---》公司使用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容器即可(第三方依賴變了)--》重寫構建映象,執行容器

烏班圖構建redis(跟底層宿主機無關)

https://zhuanlan.zhihu.com/p/623811065