一、docker概述
1.docker是什么
-
是一個開源的應用容器引擎,基于go語言開發并遵循apache2.0協議開源
-
是在Linux容器里運行應用的開源工具
-
是一種輕量級的 “虛擬機”
-
Docker的容器技術,可以在一臺主機上輕松為任何應用創建一個輕量級的、可移植的、自給自足的容器
2.docker的優點
- 達到應用組件級別的“一次封裝,到處運行”的目的。
- 這里的組件,既可以是一個應用,也可以是一套服務,甚至是一個完整的操作
- 跨平臺一致性
- 資源隔離
- 輕量級資源占用,和傳統虛擬機相比,docker容器共享虛擬機內核
3.docker的架構
-
鏡像(image):Docker 鏡像(Image),就相當于是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
-
容器(Container):鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停
-
倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker 容器通過 Docker 鏡像來創建。
4.容器概念的兩個重要技術
Docker本質就是宿主機的一個進程,docker是通過namespace實現資源隔離,通過cgroup實現資
源限制 ,通過**寫時復制技術(copy-on-write)**實現高效文件操作 (類似于虛擬機的磁盤,比如分
配500g并不是實際占用物理磁盤500g,只有當需要修改時才復制一份數據)
二、docker安裝
1.centos裝docker
先刪除舊版本docker
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
-
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux內核中支持邏輯卷管理的通用設備映射機制,它為實現用于存儲資源管理的塊設備驅動提供了一個高度模塊化的內核架構。
device mapper存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。
-
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
設置阿里云鏡像,官方源比較慢
-
yum install -y docker-ce docker-ce-cli containerd.io
docker-ce 社區版
docker-ce-cli 客服端命令行工具
containerd.io 一個容器運行時接口的實現,管理容器的啟動,創建,刪除,停止等操作
docker-compose-plugin 和K8s一樣是容器編排工具,不過前者適合開發測試小規模環境,K8s適合大規模
-
systemctl start docker.service systemctl enable docker.service
開啟服務和打開服務自啟動
docker version
2. 內網裝docker+docker-compose
- 下載docker源碼
https://download.docker.com/
按需下載
- 將下載好的的包上傳到對應服務器
解壓
tar -zxvf docker-26.1.4.tgz
解壓完之后的文件夾是docker
- 移動到可執行文件目錄下
mv docker/* /usr/bin/
- 配置docker.service
vim /usr/lib/systemd/system/docker.service
將下面的內容填進去
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
- 啟動docker服務并開啟自啟動
systemctl daemon-reload
systemctl start docker.service
docker info
systemctl enable docker
如果習慣用容器編排,附帶docker-compose
下載地址
curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 -o /usr/bin/docker-compose
github連不上用這個地址 curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-
uname -s
-uname -m
> /usr/bin/docker-compose
給他可執行的權限
sudo chmod +x /usr/bin/docker-compose
檢查是否成功安裝
docker-compose --version
### 3. 配置加速器
-
配置阿里云鏡像加速
-
登錄我們的阿里云控制臺,然后找到容器鏡像服務**
-
找到鏡像加速器---->鏡像加速地址
-
選擇對應的加速地址
-
-
配置別的加速器地址
網上直接搜,加速器地址存活周期不一定
搜到之后
vim /etc/docker/daemon.json
復制進去即可
4. 刪除docker
- 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
- 刪除資源
rm -rf /var/lib/docker
三、常用基礎命令
1.查看鏡像
docker images
2.查看容器
docker ps -a # -a參數是顯示所有容器包括隱藏的
3.下載鏡像
docker pull
docker pull nginx:1.22-alpine
docker search 查找鏡像
latest 最新版本
stable 穩定版本
nginx:1.20.2 指定版本
默認是latest 最新版本 ,若要指定版本 可在pull 后要下載的加上版本號
例子:
docker pull mysql:8.4.3
4.運行鏡像(沒下載會自動下載)
docker run
例子:
# 指定配置文件目錄,root密碼
docker run -d --name mysql8.4.3 -v /usr/local/mysql-docker/conf/:/etc/mysql/conf.d -v /usr/local/mysql-docker/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin@123 -p 3307:3306 mysql:8.4.3
-d 容器以守護進程的方式運行
–name 指定容器的名稱 方便docker start stop ,不用容器ID了太難記
-v 數據卷掛載
-e root的mysql密碼
-p 端口內外部映射
mysql:8.4.3 運行的名字和版本 如果鏡像倉庫沒有自動下載
5.刪除鏡像
docker rmi image名字
6.刪除容器
docker rm 容器名字或者id
7.容器管理
docker create 創建容器 --name
docker start 啟動容器
docker stop 停止容器
docker restart 重啟容器
docker kill 強制停止容器
docker rm 刪除容器
批量刪除所有容器 docker rm -f `docker ps -a -q`
8.查看容器狀態
docker status
單獨查看某一進程的信息
docker top mysql8.4.3
9.根據容器生成鏡像
和git
原理差不多,比如有的nginx的配置文件結構不好,你以后生成的容器是修改過后的conf文件,添加之后,把這個容器生成一個鏡像,后邊的都是容器了
docker commit -m="提交的描述信息" -a="作者" 容器id 目標鏡像名:[TAG]
10.IP綁定端口
顯示用戶只能通過宿主機的某個網卡連接這個端口
docker run -d --name "nginx_bind_ip" -p 172.16.1.81:12306:80 nginx:1.20.2-alpine
11.查看容器信息
docker inspect 容器名字或者id
加| jq .[].HostConfig.Binds
能看到掛載的目錄端口還有容器網絡啥的
12.查看容器日志
docker logs -n 容器名
13. 容器主機直接拷貝文件
docker cp
例子:
docker exec -it 6eda31ad7987 /bin/bash,先進入到容器內部docker cp 6eda31ad7987:/home/test.java /home
14. sl大法(復制鏡像可建立遠程docker倉庫)
docker image save -o XXXX#docker save
docker image load -i #docker load
四、docker裝各種服務
1. docker裝mysql(8.4.3)
- 拉去鏡像
docker pull mysql:8.4.3
- 運行起來
docker run -d --name mysql8.4.3 -v /usr/local/mysql-docker/conf/:/etc/mysql/conf.d -v /usr/local/mysql-docker/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin@123 -p 3307:3306 mysql:8.4.3
-d 容器以守護進程的方式運行
–name 指定容器的名稱 方便docker start stop ,不用容器ID了太難記
-v 數據卷掛載
-e root的mysql密碼
-p 端口內外部映射
mysql:8.4.3 運行的名字和版本 如果鏡像倉庫沒有自動下載
- 進入容器
docker exec -it mysql8.4.3 bash
- 登錄mysql
mysql -uroot -p
- 編寫配置文件
cd /usr/local/mysql-docker/conf
vim my.cnf
編輯內容如下
[mysqld]port=3306datadir=/var/lib/mysqlmax_allowed_packet=1024Mmax_connections=1000# 默認字符集character-set-server=utf8mb4collation-server=utf8mb4_general_ci# binlog日志server-id=2018log-bin=mysql-bin# 保存15天binlog_expire_logs_seconds=1296000# 選擇 binlog 文件的最大大小,達到該大小時會自動切換到新的日志文件max-binlog-size=100M# 記錄 binlog 文件時排除某些查詢binlog-ignore-db=information_schemabinlog-ignore-db=performance_schemabinlog-ignore-db=mysql
?
2.docker裝nginx
- 拉去鏡像
docker pull nginx:1.26.2
- 創建掛載目錄
創建掛載目錄
mkdir -p /usr/local/nginx-docker/conf
mkdir -p /usr/local/nginx-docker/conf/conf.d
mkdir -p /usr/local/nginx-docker/log
mkdir -p /usr/local/nginx-docker/html
- 生成容器遷移配置文件
#生成容器
docker run --name nginx --restart=always -p 80:80 -d nginx:1.26.2
#將容器nginx.conf文件復制到宿主機
docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx-docker/conf/nginx.con
#將容器conf.d文件夾下內容復制到宿主機
docker cp nginx:/etc/nginx/conf.d /usr/local/nginx-docker/conf/conf.d
#將容器中的html文件夾復制到宿主機
docker cp nginx:/usr/share/nginx/html /usr/local/nginx-docker/
創建Nginx容器并運行
#直接執行docker rm nginx或者以容器id方式關閉容器
#找到nginx對應的容器id
docker ps -a
#關閉該容器
docker stop nginx
#刪除該容器
docker rm nginx
#刪除正在運行的nginx容器
docker rm -f nginx
- docker 創建nginx容器
docker run \
-p 80:80 \
--name nginx \
-v /usr/local/nginx-docker/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx-docker/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx-docker/log:/var/log/nginx \
-v /usr/local/nginx-docker/html:/usr/share/nginx/html \
--restart=always \
-d nginx:1.26.2
docker run
-p 80:80
-p 443:443
–name nginx
-v /usr/local/nginx-docker/conf/nginx.conf:/etc/nginx/nginx.conf
-v /usr/local/nginx-docker/conf/conf.d:/etc/nginx/conf.d
-v /usr/local/nginx-docker/log:/var/log/nginx
-v /usr/local/nginx-docker/html:/usr/share/nginx/html
-d nginx:1.26.2有多少端口就在這里面加就行
命令 | 描述 |
---|---|
–name nginx | 啟動容器的名字 |
-d | 后臺運行 |
-p 80:80 | 映射端口 |
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf | 掛載nginx.conf配置文件 |
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d | 掛載nginx配置文件 |
-v /home/nginx/log:/var/log/nginx | 掛載nginx日志文件 |
-v /home/nginx/html:/usr/share/nginx/html | 掛載nginx內容 |
nginx:latest | 本地運行的版本 |
\ | shell 命令換行 |
https://download.docker.com/ 下載docker
3.內網docker裝oracle
一、內網裝dorcker
- 下載docker源碼
https://download.docker.com/
按需下載
- 將下載好的的包上傳到對應服務器
解壓
tar -zxvf docker-26.1.4.tgz
解壓完之后的文件夾是docker
- 移動到可執行文件目錄下
mv docker/* /usr/bin/
- 配置docker.service
vim /usr/lib/systemd/system/docker.service
將下面的內容填進去
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
- 啟動docker服務并開啟自啟動
systemctl daemon-reload
systemctl start docker.service
docker info
systemctl enable docker
如果習慣用容器編排,附帶docker-compose
下載地址
https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64
給他可執行的權限
sudo chmod +x /usr/bin/docker-compose
檢查是否成功安裝
docker-compose --version
二、安裝docker-oracle
-
上傳docker-oracle鏡像包
-
導入鏡像包
docker load -i 鏡像包
- 執行
docker images
檢查是否存在鏡像oracle:oracle11g
存在則導入成功
- 創建并啟動容器
docker run -itd \--name oracle11g \-p 1521:1521 \-p 5500:5500 \--mount source=oracle_vol,target=/opt/oracle/app/oradata \-e ORACLE_HOME=/opt/oracle/app/product/11.2.0/dbhome_1 \-e ORACLE_SID=ORCL \-e PATH=$ORACLEHOME/bin:PATH \--restart always \yycx/oracle11 掛載的數據有點大 run的時候可能會比較慢,如果只是為了測試搭建,可以不掛載數據持久化
-p 宿主機映射端口:docker端口
–name 容器的名字
–restart=alway 開機自啟動
–mount source=oracle_vol,target=/opt/oracle/app/oradata \ 掛載磁盤實現數據持久化
-e ORACLE_SID=ORCL \ 實例名字用來連接的
#新建docker卷-----docker volume create oracle11g
#查看docker卷-------docker volume ls
#卷路徑-------find / -name oracle11g
這個卷的路徑就是數據持久化存放的位置
- 進入容器進行配置
docker exec -it oracle11g bash
- 創建軟連接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
#可以全局使用sqlplus
- 登錄Oracle的一些初始化操作
su - oracle 切換oraclesqlplus /nolog 啟動sqlplus但不立即登錄數據庫connect /as sysdba 以sysdba去登錄oraclealter user system identified by nomax; 修改system的密碼是nomax
alter user sys identified by nomax; 修改sys 的密碼是nomax
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 配置密碼不過期
alter system set processes=1000 scope=spfile; 修改最大連接數是1000
sqlplus /nolog 啟動sqlplus但不立即登錄數據庫
connect /as sysdba 以sysdba去登錄
alter user system identified by nomax; 設置system的密碼是nomax
alter user sys identified by nomax; 設置sys的密碼是nomaxALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 配置密碼不過期
- 創建用戶并指定表空間,授權
SQL> create user nomax IDENTIFIED BY nomax default tablespace nomax;User created.SQL> grant connect,resource,dba to nomax;Grant succeeded.創建一個nomax的用戶,分配表空間nomax,密碼是nomax,授予他connect,resource,dba的權限
題外話:
conn /as sysdba;
shutdown immediate; --關閉數據庫
startup; --啟動數據庫
show user;
修改密碼的時候會出現:database not open
- 提示數據庫沒有打開
輸入:alter datebase open
還有出現:datebase not mountd
- 提示數據庫沒有被掛載
輸入:alter database mount;
輸入:alter database open;
這個沒被掛載是因為宿主機和docker 掛載磁盤出現的問題,有可能是權限dockers的oracle沒有權限存放到映射的宿主機目錄,也有可能是操作問題,本來我是直接-v映射的,但是一直出現這個問題,后來索性用了掛載volume卷,解決了。
4. docker裝tomcat
- 拉鏡像
tomcat
docker pull tomcat:7.0
- 創建宿主機映射目錄
mkdir -p /usr/local/docker-tomcat/webapps/
mkdir -p /usr/local/docker-tomcat/conf/
mkdir -p /usr/local/docker-tomcat/logs/
- run起來并配置數據持久化映射
docker run -di --name=tomcat -p 8080:8080 -p1521:1521 -v /usr/local/docker-tomcat/webapps/:/usr/local/tomcat/webapps/ -v /usr/local/docker-tomcat/conf/:/usr/local/docker-tomcat/conf/ -v /usr/local/docker-tomcat/logs/:/usr/local/docker-tomcat/logs/ tomcat:7.0
記得把tomcat連接的服務器的映射端口打開
- cp容器自帶的文件到掛載磁盤
docker cp tomcat:/usr/local/tomcat/conf/* /usr/local/docker-tomcat/conf/
- 進入容器內
docker exec -it tomcat bashcd bin
啟動tomcat
tomcat默認最小安裝webapps下啥也沒有
在tomcat目錄下有一個
webapps.dist
目錄,這個目錄下有我們所需要的文件,也就是webapps目錄所需要的文件,我們將這個文件中的內容全部拷貝到webapps下。cp -r webapps.dist/* webapps
五、容器編排技術
1.單機編排
docker鏡像可以通過Dockerfile一鍵創建.
目前問題:? docker容器的管理(啟動,關閉,重啟),需要手動執行,如何管理多個容器.
單機容器編排工具
docker compose
- 下載安裝
yum install -y docker-compose
或者
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
官方文檔下載 并放到bin下
給可執行權限
sudo chmod +x /usr/local/bin/docker-compose
- 驗證
docker-compose --version
- 書寫格式
compose.yaml
compose.yml
docker-compose.yaml
docker-compose.yml
默認支持的compose文件名.
services:mysql8.4.3:image: "mysql:8.4.3"environment:- MYSQL_ROOT_PASSWORD=admin@123volumes:- "./data:/var/lib/mysql"- "./conf:/etc/mysql/conf.d" container_name: mysql8.4.3 ports: - "3307:3306"restart: always
- 常用基本命令
- 啟動服務
docker-compose up -d
-d 是在后臺運行不占用終端
? 2.查看服務狀態
docker-compose ps
? 3.停止服務
docker-compose down
? 4.刪除服務
docker-compose stop 服務名字
docker-compose rm 服務名字
默認不會刪除掛載的數據卷
docker-compose rm -v 服務名
加-v參數可一塊刪除掛載的數據卷
? 5.查看日志
docker-compose logs [service_name]
? 6.重建服務
修改完yml文件后執行docker-compose up -d [service_name]
六、Dockerfile 學習
什么是Dockerfile
Dockerfile 是一個文本文件,包含了構建 Docker 鏡像的所有指令。
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
通過定義一系列命令和參數,Dockerfile 指導 Docker 構建一個自定義的鏡像。
和commit生成的會變大,然后也沒有dockerfile透明清除,但是commit根據已有的容器生成臨時用比較方便
Dockerfile制定鏡像
- 下面以定制一個 nginx 鏡像(構建好的鏡像內會有一個 /usr/share/nginx/html/index.html 文件)
在一個空目錄下,新建一個名為 Dockerfile 文件,并在文件內添加以下內容:
FROM nginx
RUN echo '這是一個本地構建的nginx鏡像' > /usr/share/nginx/html/index.html
- FROM 和 RUN 指令的作用
FROM:定制的鏡像都是基于 FROM 的鏡像,這里的 nginx 就是定制需要的基礎鏡像。后續的操作都是基于 nginx。
RUN:用于執行后面跟著的命令行命令。有以下倆種格式:
注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上執行會創建 3 層鏡像。可簡化為以下格式:
FROM centos
RUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz
用&&
符號連接
- 開始構建鏡像
在 Dockerfile 文件的存放目錄下,執行構建動作。
以下示例,通過目錄下的 Dockerfile 構建一個 nginx:v3(鏡像名稱:鏡像標簽)。
注:最后的 . 代表本次執行的上下文路徑,下一節會介紹。
$ docker build -t nginx:v3 .
指令詳解表:
Dockerfile 指令**** | 說明 |
---|---|
FROM | 指定基礎鏡像,用于后續的指令構建。 |
MAINTAINER | 指定Dockerfile的作者/維護者。(已棄用,推薦使用LABEL指令) |
LABEL | 添加鏡像的元數據,使用鍵值對的形式。 |
RUN | 在構建過程中在鏡像中執行命令。 |
CMD | 指定容器創建時的默認命令。(可以被覆蓋) |
ENTRYPOINT | 設置容器創建時的主要命令。(不可被覆蓋) |
EXPOSE | 聲明容器運行時監聽的特定網絡端口。 |
ENV | 在容器內部設置環境變量。 |
ADD | 將文件、目錄或遠程URL復制到鏡像中。 |
COPY | 將文件或目錄復制到鏡像中。 |
VOLUME | 為容器創建掛載點或聲明卷。 |
WORKDIR | 設置后續指令的工作目錄。 |
USER | 指定后續指令的用戶上下文。 |
ARG | 定義在構建過程中傳遞給構建器的變量,可使用 “docker build” 命令設置。 |
ONBUILD | 當該鏡像被用作另一個構建過程的基礎時,添加觸發器。 |
STOPSIGNAL | 設置發送給容器以退出的系統調用信號。 |
七、Docker命令大全
容器生命周期管理
語法 | 詳細解釋 |
---|---|
run起來 | run命令 |
開始暫停重啟容器 | docker start/stop/restart 命令 |
docker kill 容器/id 強制殺死 | docker kill 命令 |
docker rm 容器 刪除容器 | Docker rm 命令 |
暫停 | docker pause/unpause 命令 |
創建容器但不會運行 | Docker create 命令 |
進入容器內部 | Docker exec 命令 |
docker rename 當前容器名稱或ID 新容器名稱 | Docker rename 命令 |
網絡命令
-
docker network ls
: 列出所有網絡。 -
docker network create <network>
: 創建一個新的網絡。 -
docker network rm <network>
: 刪除指定的網絡。 -
docker network connect <network> <container>
: 連接容器到網絡。 -
docker network disconnect <network> <container>
: 斷開容器與網絡的連接。
卷命令
docker volume ls
: 列出所有卷。docker volume create <volume>
: 創建一個新的卷。docker volume rm <volume>
: 刪除指定的卷。docker volume inspect <volume>
: 顯示卷的詳細信息。
https://www.runoob.com/docker/docker-rm-command.html) |
| 暫停 | docker pause/unpause 命令 |
| 創建容器但不會運行 | Docker create 命令 |
| 進入容器內部 | Docker exec 命令 |
| docker rename 當前容器名稱或ID 新容器名稱 | Docker rename 命令 |
網絡命令
-
docker network ls
: 列出所有網絡。 -
docker network create <network>
: 創建一個新的網絡。 -
docker network rm <network>
: 刪除指定的網絡。 -
docker network connect <network> <container>
: 連接容器到網絡。 -
docker network disconnect <network> <container>
: 斷開容器與網絡的連接。
卷命令
docker volume ls
: 列出所有卷。docker volume create <volume>
: 創建一個新的卷。docker volume rm <volume>
: 刪除指定的卷。docker volume inspect <volume>
: 顯示卷的詳細信息。