網站首頁 編程語言 正文
Docker
入門到精通
ssh root@39.101.184.220
"""
1)docker就是Linux上及其輕量的虛擬機
2)虛擬機是存在宿主系統中,通過鏡像給宿主系統拓展子系統的(一個鏡像理論上可以做n個子系統)
3)兩個特別重要的概念
image:鏡像
container:容器(子系統)
4)工作方式:
i)在服務器系統下載docker(為服務器安裝虛擬機,服務器系統就是宿主系統)
ii)用docker去下載對應需求的鏡像:鏡像操作
iii)通過鏡像制造容器(裝子系統):容器操作
5)優勢
i)超級輕量級,docker安裝的容器體積可以按kB度量
ii)集群部署,docker可以通過一個鏡像制造出多個一模一樣的容器
iii)便捷管理所有鏡像與容器(命令行操作)
6)鏡像和容器特點
一般一個鏡像中只包含一種軟件:比如mysql鏡像,創建的容器中只有mysql環境;redis鏡像,創建的容器中只有redis環境
注:一個鏡像中有多個環境的需要自己制作鏡像
"""
docker-ce : 免費(使用最多)
docker-ee :收費
CentOS安裝Docker
方法一
設置管理Docker的倉庫
"""
1)安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2)安裝穩定倉庫
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
"""
安裝Docker Engine-Community
"""
1)安裝
>: yum install docker-ce docker-ce-cli containerd.io
2)如果提示您接受 GPG 密鑰,請允許
"""
方法二
"""
# centos7 安裝docker
1 安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2 設置yum源為阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3 安裝
sudo yum install docker-ce -y
"""
docker 版本:裝的最新版
docker -v
Docker version 19.03.8, build afacb8b
docker -v查看版本,如果是17年之前的,就是老版本,操作習慣不一樣
Docker基礎命令
開啟關閉
"""
1)啟動
>: service docker start | systemctl start docker
2)關閉
>: service docker stop | systemctl stop docker
3)重啟
>: service docker restart | systemctl restart docker
"""
查找鏡像
# 查找鏡像:https://hub.docker.com/
docker search helloworld
docker search centos
# 拉取鏡像
docker pull centos # 拉取最新的:相當于docker pull centos:latest
docker pull centos:centos7 # 拉取一個centos7
docker pull centos:centos6.7
docker pull centos:centos10 # 這個 沒有,就報錯
鏡像操作
"""
1)列出鏡像
>: docker image ls
2)拉取鏡像
>: docker [image] pull 鏡像名:版本
eg: docker image pull hello-world:latest # 最后一個版本
3)刪除鏡像
如果有容器了,可以強制刪除鏡像。不推薦這么做
>: docker image rm 鏡像ID
>: docker image rm 鏡像名字:鏡像版本 # 通過名字刪除
docker image rm centos:centos7
4)將容器反向打包鏡像
>: docker save -o <文件名.tar> <鏡像名>
5)根據打包的鏡像文件加載鏡像
>: docker load -i <文件名.tar>
"""
容器操作
"""
docker exec --help # 查看參數的含義
1)創建容器
>: docker run [選項參數] 鏡像名 [命令]
創建容器命令:docker run
-i:表示運行容器
-t:表示容器啟動后會進入其命令行。加入這兩個參數后,容器創建就能登錄進去。即分配一個偽終端。
--name :為創建的容器命名。容器名字不能重
-v:表示目錄映射關系(前者是宿主機目錄,后者是容器的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上。
-d:在run后面加上-d參數,則會創建一個守護式容器在后臺運行(這樣創建容器后不會自動登錄容器,如果只加-i -t兩個參數,創建后就會自動進去容器)。
-p:表示端口映射,前者是宿主機端口,后者是容器內的映射端口。可以使用多個-p做多個端口映射
# 演示
#基于哪個鏡像跑容器:centos:centos7 如果寫成centos表示跑最新的
#如果沒有這個鏡像呢?去遠程拉,拉下來再跑,遠程沒有就報錯
# 1.容器要運行(跑完進入了容器)
docker run -it --name=mycentos7 centos:centos7 /bin/bash
/bin/bash:進入容器,并開一個終端
bash:進入內層終端
exit: 退出一層
# 2.以守護進程形式跑(跑完沒有進入容器)
docker run -di --name=mycentos2_2 centos:centos7
2)查看所有容器:-a就是--all代表全部展示
>: docker container ls [-a]
>: docker ps [-a]
3) 容器的啟動與停止
docker stop 容器id/名字
docker start 容器id/名字
docker restart 容器id/名字
4)kill掉一個已經在運行的容器
>: docker kill 容器id
5)刪除容器
停止后才能刪除
>: docker rm 容器id
6)進入容器
1.exec(使用最多)
2.attach
3.ssh連接(容器要啟動ssh服務22端口沒有服務在監聽)
>: docker exec 參數 容器id bash
eg: docker exec -it mycentos7 bash
eg: docker exec -it 685e1 bash
eg: docker exec mycentos2_2 ls # 在mycentos2_2的容器中執行ls,并打印結果
7)退出容器
>: exit
"""
文件拷貝
# 文件拷貝
# 從宿主機copy到容器內部
docker cp untitled3.tar mycentos2_2:/home
# 從容器內部copy出來
docker cp mycentos2_2:/home/untitled3.tar ./
目錄映射(數據卷)
# 映射之后,操作宿主機目錄和操作容器目錄會相互影響
docker run -di --name=mycentos2_3 -v /root/test:/home centos:centos7
名字 宿主機/root/test映射到容器 /home 版本
查看容器信息
docker inspect 容器名字/容器id
# 查看ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id/名字
docker應用部署
# mysql服務 在docker中運行 -e表示環境變量,root密碼
docker run -id --name=mysql1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# redis服務 在docker中運行
docker run -id --name=myredis -p 6379:6379 redis
# docker中部署django項目 nginx + django +uwsgi
容器打包成鏡像
# 把容器打包成鏡像
docker run -di --name=mydjango python:3.6
# 安裝django環境
pip install django==1.11.9
apt-get update
apt-get install vim
# 把容器打包成鏡像
docker commit 容器名字 鏡像名字
docker commit mydjango mydjango_i
# 基于鏡像再跑起容器
docker run -di --name=mydjango2 mydjango_i
# 鏡像打成一個tar包,壓縮一下(在當前目有個mydjango.tar)
docker save -o 壓縮包名字.tar mydjango_i
# copy這個壓縮包到任意的機器上(裝了docker)
# 把壓縮包,恢復成鏡像
docker load -i 壓縮包名字.tar
容器里裝了python3.6 mysql,django, uwsgi ,redis 項目在里面---》鏡像--》容器
10個容器
django+uwsgi mysql redis 一個一個起:docker-compose
100臺機器,10w容器 k8s
總結
# 容器的操作
查看正在運行的容器:docker ps
查看所有容器:docker ps -a
刪除容器:docker rm 容器id/名字 容器id/名字 支持同時刪多個
容器啟動停止: docker stop/start/restart 容器名字/id
創建并啟動容器:docker run -i -d -t --name=名字 -v 目錄映射/數據卷 -p 端口映射/網絡 鏡像名字:tag
-鏡像如果沒有,會自動去拉取,然后啟動
查看容器日志:docker logs 容器id/名字
文件拷貝: docker cp
查看容器信息,ip:docker inspect 容器名稱(容器ID)
進入容器:docker exec -it 容器id /bin/bash
docker exec 容器id ls
ssh
attach
Docker file編寫
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像,用來構建鏡像的
# docker pull
# 通過容器---》打包成鏡像--》壓縮--》拿到任何位置
# 通過Dockerfile構建鏡像
1、對于開發人員:可以為開發團隊提供一個完全一致的開發環境;
2、對于測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了;
3、對于運維人員:在部署時,可以實現應用的無縫移植。
docker file常用命令
命令 作用
FROM image_name:tag 定義了使用哪個基礎鏡像啟動構建流程 # FROM 鏡像名:版本
MAINTAINER user_name 聲明鏡像的創建者
ENV key value 設置環境變量 (可以寫多條)
(核心)RUN command 是Dockerfile的核心部分(可以寫多條)
eg:寫要執行的命令(centos上裝一個python3.6,原來在linux上裝python,如何操作,就用命令一行一行寫出來)
RUN wget http://www..../python.tar.gz
RUN tar -cvf python.tar.gz
RUN cd python
RUN make && make install
RUN pip3 install django==1.11.9
ADD source_dir/file dest_dir/file 將宿主機的文件復制到容器內,如果是一個壓縮文件,將會在復制后自動解壓
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有壓縮文件并不能解壓
WORKDIR path_dir 設置工作目錄(上面操作的命令都是在這個目錄,docker exec 進去,就在當前設置的路徑下,之前是在根路徑下)
CMD [命令] 容器一運行,就會執行命令
# ADD和COPY的區別?一個會解壓,一個默認不會解壓
eg:基于python3.6構建docker file鏡像
# 寫一個Dockerfile,基于python3.6 搭建運行環境:django,drf,uwsgi
# 名字必須交 Dockerfile ,當你構建的時候,會在當前路徑下找這個文件,自動構建
vim Dockerfile
FROM python:3.6
MAINTAINER lqz
ADD ./django_test.tar /home
RUN pip install -r /home/django_test/requirement.txt -i https://pypi.doubanio.com/simple
CMD ["/bin/bash"]
# 基于docker file構建
docker build -t='django1.11.9' # django1.11.9就是構建完之后的鏡像名字
構建完之后就有一個django1.11.9的鏡像
# 基于該鏡像構建容器
docker run -di --name=myproject -p 8080:8080 django1.11.9
# docker logs myproject 查看報錯信息
容器部署項目,用 nuginx做負載均衡
# 1 在項目路徑下寫Dockerfile
FROM python:3.6
MAINTAINER lqz
ADD ./requirement.txt /home/
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
WORKDIR /home/django_test
EXPOSE 8080
VOLUME ["/home"]
CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"]
# 2 在項目路徑下寫一個uwsgi.ini
[uwsgi]
#也可以使用http
http=0.0.0.0:8080
#配置項目路徑,項目的所在目錄
chdir=/home/django_test
#配置wsgi接口模塊文件路徑
wsgi-file=django_test/wsgi.py
#配置啟動的進程數
processes=4
#配置每個進程的線程數
threads=2
#配置啟動管理主進程
master=True
#配置存放主進程的進程號文件
pidfile=uwsgi.pid
# 3 傳到git上(我們直接復制過去了)
在服務器從git上拉下來,解壓開
# 4 基于docker file構建鏡像
docker build -t='django1.11.9' .
#5 運行起django+uwsgi的容器
docker run -di --name=mydjango1 -v /home/s13/myproject:/home -p 8080:8080 django1.11.9
docker run -di --name=mydjango2 -v /home/s13/myproject2:/home -p 8088:8080 django1.11.9
# 6 基于ngixn鏡像跑起一個容器來,做目錄映射(在宿主機,修改nginx的配置文件)
# 創建幾個文件夾
mkdir -p /home/nginx/conf /home/nginx/html /home/nginx/logs
vim /home/nginx/conf/nginx.conf
#寫入
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream node { # node名字隨便取,下面需要用到
server 101.133.225.166:8080; # 1號服務器
server 101.133.225.166:8088; # 2號服務器
}
server {
listen 80;
server_name localhost;
location / {
#負載均衡配置
proxy_pass http://node; # 負載均衡,隨機分發請求
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
docker run --name nginx -id -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginx
#7 訪問http://101.133.225.166/, 會打到不通的docker容器內,即便有一個服務停了,也不會影響項目的運行
# 因為你django docker容器做了目錄映射---》只需要修改代碼,重啟容器即可(git pull 即可)
# 不停服更新,停一半,更新,啟動--在把另一半更新了
# 停服更新
Docker私有倉庫搭建
# 鏡像獲取:
docker pull
dockerfile構建
拷貝tar文件,load過來
# 公司內部用的鏡像,docker hub上沒有,私服(私有服務器)
# 操作步驟
# 1 拉一個registry鏡像 (本質是個什么?web服務(想像成 web項目在里面))
docker pull registry
# 2 跑起容器來
docker run -di --name=registry -p 5000:5000 registry
# 3 瀏覽器輸入地址(目前是空的)
http://宿主機:5000/v2/_catalog
# 4 vi /etc/docker/daemon.json (文件如果沒有就創建出來),以后docker pull 先從自己配置的這個拉,再去遠程拉
{"insecure-registries":["10.0.0.200:5000"]} # 宿主機地址
# 5 重啟docker 服務
systemctl restart docker
# 6 啟動容器
docker restart registry
# 7 標記本地的鏡像(可能是dockerfile構建的,也可能是通過容器打包成的)
docker tag django1.11.9 101.133.225.166:5000/django1.11.9
# docker tag redis 101.133.225.166:5000/myredis
# 8 把標記好的本地鏡像,傳到私服
docker push 101.133.225.166:5000/django1.11.9
#docker push 101.133.225.166:5000/myredis
# 9 再訪問這個地址http://宿主機:5000/v2/_catalog
就能看到你上次的鏡像再里面了
# 10 只要在etc/docker/daemon.json,配置了這個{"insecure-registries":["101.133.225.166:5000"]} 的所有小伙伴,都可以拉取我上傳的鏡像
docker pull 101.133.225.166:5000/myredis
# 公司可能沒有私服,直接通過dockerfile構建
# 大一點的公司,搭建私有倉庫,里面放了一些鏡像(不讓你去docker hub下了,直接只從私有倉庫下載)
Docker安裝Mysql
"""
1)安裝
>: docker image pull mysql:5.7
>: 如果報錯m1安裝:docker pull --platform linux/x86_64 mysql
2)創建容器:root根用戶的密碼MYSQL_ROOT_PASSWORD采用的是root
>: docker container run -itd -p3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
docker run -id --name=mysql3308 -p3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
注:本地測試
>: mysql -hIP -P端口 -uroot -p密碼
>: mysql -h 39.99.192.127 -P 3306 -u root -p
>: root
>: create database luffy default charset=utf8;
>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
>: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
>: flush privileges;
"""
docker內部mysql允許外部訪問
M1拉鏡像:docker pull --platform linux/x86_64 mysql
先進入到mysql容器內部,并登陸mysql -uroot -p
use mysql;
update user set authentication_string = password('123456') where user = 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456' WITH GRANT OPTION;
用戶名:root
密碼:123456
Docker安裝Redis
"""
1)下載鏡像
>: docker pull redis:4.0.9
2)創建容器
>: docker container run -itd -p6379:6379 redis:4.0.9
## : -p宿主端口(服務器):容器端口(通過鏡像安裝的)
3)進入容器
>: docker container exec -it <容器名稱/容器ID> bash
eg: docker exec -it 685e1 bash
4)測試
>: redis-cli
>: redis-cli -h 39.99.192.127 -p 6379
>: config set requirepass Admin123
"""
原文鏈接:https://www.cnblogs.com/guyouyin123/p/12469637.html
相關推薦
- 2024-03-03 layui彈窗編輯表單清空
- 2022-08-30 啟動Activity但是不顯示界面
- 2023-10-16 el-radio單選框,取消選中
- 2022-02-16 IDEA 無法彈出模態框 HTTP 錯誤: 狀態代碼 404,net::ERR_HTTP_RESPO
- 2022-05-14 基于Unity編寫一個九宮格抽獎軟件_C#教程
- 2022-06-10 SQL?Server使用導出向導功能_MsSql
- 2022-12-12 React?高階組件與Render?Props優缺點詳解_React
- 2022-10-17 Kotlin編程基礎數據類型示例詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支