Docker學習
檔案地址:https://docs.docker.com/engine/
Docker的基本組成

鏡像(image):
docker鏡像就好比是一個模板,可以通過這個模板來創建容器服務,tomcat鏡像 ===> run ===> tomcat1容器(提供服務器),通過這個鏡像可以創建多個容器(最終服務運行或者專案運行就是在容器中的)
容器(container):
Docker利用容器技術,獨立運行一個或者一個組應用,通過鏡像來創建的,
啟動,停止,洗掉,基本命令,
目前就是可以把這個容器理解為就是一個簡易的linux系統,
倉庫(reponsitory):
倉庫就是存放鏡像的地方,
倉庫分為公有倉庫和私有倉庫,
Docker HUb (默認是國外的),
阿里云…都有容器服務器(配置鏡像加速),
安裝Docker
環境準備
1、會一點點的Linux的基礎
2、CentOS 7
3、服務器連接工具
環境查看
安裝
幫助檔案
# 1、先卸載原Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、需要的安裝包
yum install -y yum-utils
# 3、設定鏡像的倉庫
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 官方默認,不推薦使用
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云,推薦使用
# 更新 yum 軟體包索引(最好)
yum makecache fast
# 4、安裝 docker docker-ce 社區 ee 企業版
yum install docker-ce docker-ce-cli containerd.io
# 5、啟動 docker
systemctl start docker
# 6、使用docker version 查看版本號
docker version
# 7、測驗 hello word
docker run hello-world
# 7.1(附加)、如果報錯 error pulling image configuration: (時間不同步)
執行一下命令:ntpdate time.windows.com
如遇到命令不存在: yum -y install netdate
```shell
# 查看鏡像
[root@VM-0-4-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3kB
# 卸載docker
yum remove docker-ce docker-ce-cli containerd.io # 洗掉依賴
rm -rf /var/lib/docker # 洗掉目錄
配置阿里云鏡像加速
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://2lrywg60.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Run 的流程

底層原理
Docker是怎么作業的?
Docker是一個 Client - Server 結構的系統,Docker的守護行程運行在主機上,通過 Socket 從客戶端訪問,
DockerServer 接收到 Docker-Clinet 的指令,就會執行這個命令,
Docker為什么比 VM 快?
1、Docker有著比虛擬機更少的抽象層,
2、Docker 利用的是宿主機的內核,vm需要的是 Guest OS,

所以說,新建一個容器的時候,doker不需要像虛擬機一樣重新加載一個作業系統內核,避免引導,虛擬機是加載 Guest OS,分鐘級別的,而 Docker 是利用宿主機的作業系統,省略了這個復雜的程序,秒級,
Docker的常用命令
幫助命令
docker version # 查看版本資訊
docker info # 顯示docker的系統資訊,包括鏡像和容器的數量
docker 命令 --help # 幫助命令
幫助檔案的地址:https://docs.docker.com/reference/
鏡像命令
docker images : 查看所有鏡像
[root@VM-0-4-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3kB
REPOSITORY: 鏡像的倉庫源
TAG: 鏡像的標簽
IMAGE ID: 鏡像的ID
CREATED: 鏡像的創建時間
SIZE: 鏡像的大小
# 可選項
-a, --all # 列出所有鏡像
-q, --quiet # 只顯示鏡像id
docker searsh 搜索鏡像
#docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10475
mariadb MariaDB is a community-developed fork of MyS… 3896
mysql/mysql-server Optimized MySQL Server Docker images. Create… 769
percona Percona Server is a fork of the MySQL relati… 526
centos/mysql-57-centos7 MySQL 5.7 SQL database server 87
# 可選項
-filter=STARS=3000 #搜索出來的鏡像就是 stars 大于 3000
[root@VM-0-4-centos ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10475 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3896 [OK]
docker pull 下載鏡像
# 下載鏡像 docker pull 鏡像名 [:tag]
[root@VM-0-4-centos ~]# docker pull mysql
Using default tag: latest # 如果不寫 tag,默認就是latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete # 分層下載,docker image 的核心,聯合核減系統
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c # 簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真實地址
# 等價于它
docker pull mysql
Status: Downloaded newer image for mysql:latest
# 制定版本下載
[root@VM-0-4-centos ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
# Already exists 已經存在的可以共用(牛逼)
a076a628af6f: Already exists
1831ac1245f4: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看所有下載好的鏡像
[root@VM-0-4-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a70d36bc331a 3 weeks ago 449MB
mysql latest c8562eaf9d81 3 weeks ago 546MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
docker rmi 洗掉鏡像
# docker rmi 鏡像id 根據id洗掉鏡像
# docker rmi 鏡像id 鏡像id 根據多個id洗掉鏡像
[root@VM-0-4-centos ~]# docker rmi c8562eaf9d81
Untagged: mysql:latest
Untagged: mysql@sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
# 騷操作 遞回洗掉所有鏡像
# docker rmi -f $(docker images -aq)
Untagged: mysql:5.7
Untagged: mysql@sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5
Untagged: hello-world:latest
Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
容器命令
說明:我們有了鏡像才可以創建容器,Linux,下載一個 centos 鏡像來學習,
docker pull centos
新建容器并啟動
docker run [可選引數] image
# 引數說明
--name="Name" 容器名字,tomcat01 tomcat02 用來區分容器
-d 后臺方式運行
-it 使用互動方式運行,進入容器查看內容
-p 制定容器埠 -p 8080:8080
-p ip 主機埠:容器埠
-p 主機埠:容器埠(常用)
-p 容器埠
容器埠
-P 隨機制定埠
# 測驗,啟動并進入容器
[root@VM-0-4-centos ~]# docker run -it centos /bin/bash
[root@911c6a4376a6 /]# ls # 查看容器內的 centos 很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 從容器中退回主機
[root@911c6a4376a6 /]# exit
exit
列出所有運行中的容器
[root@VM-0-4-centos ~]# docker ps
-a # 列出當前正在運行中的容器 + 帶出歷史運行過的容器
-n=? # 顯示最新創建的容器
-q # 只顯示容器的編號
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-0-4-centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
911c6a4376a6 centos "/bin/bash" About a minute ago Exited (0) 58 seconds ago frosty_mclaren
c53e78ce61bd bf756fb1ae65 "/hello" 12 hours ago Exited (0) 12 hours ago thirsty_fermat
退出容器
exit # 直接容器停止并退出
Ctrl + P + Q # 退出不停止
洗掉容器
docker rm 容器id # 洗掉制定容器,不能洗掉正在運行的容器,如果要強制洗掉就 rm -f
docker rm -f $(docker ps -aq) # 遞回洗掉所有容器
docker ps -a -q|xargs docker rm # 洗掉所有容器
啟動/停止容器操作
docker start 容器id # 啟動容器
docker restart 容器id # 重啟容器
docker stop 容器id # 停止正在運行容器
docker kill 容器id # 強制停止當前容器
常用其他命令
后臺啟動容器
# 命令 docker run -d 鏡像名字
[root@VM-0-4-centos ~]# docker run -d centos
7fc42aaf4d5d2a7c9713639b47a9711ae9c8bc4f79e37a087676e2c5b6bbc5f7
# 問題 docker ps,發現centos 停止了
# 常見的坑 docker 容器使用后臺運行,就必須要有個前臺行程,docker 發現沒有應用,就會自動停止
# nginx 容器啟動后,發現自己沒有提供服務,就會立刻停止,就是沒有程式另了
查看日志
docker logs -f -t --tail number(條數) 容器
# 撰寫一個shell腳本模擬日志
[root@VM-0-4-centos ~]# docker run -d centos /bin/sh -c "while true;do eche dengxian;sleep 1;done"
# 顯示日志
-tf # 顯示日志
--tail number(顯示日志條數)
[root@VM-0-4-centos ~]# docker logs -tf --tail 2 12057bc3ef72
2021-02-10T02:01:53.559123855Z /bin/sh: dengxian
2021-02-10T02:01:54.561216524Z /bin/sh: dengxian
查看容器中行程資訊
# 命令 docker top 容器id
[root@VM-0-4-centos ~]# docker top 12057bc3ef72
UID PID PPID C STIME TTY TIME CMD
root 18700 18682 0 09:59
root 20286 18700 0 10:03 /usr/bin/sleep 1
查看鏡像元資料
#docker inspect 容器id
# 測驗
[root@VM-0-4-centos ~]# docker inspect 12057bc3ef72
[
{
"Id": "12057bc3ef72faa754b53de68c279fd4cd1f5248002ee3b25d37f80447ecb164",
"Created": "2021-02-10T01:59:02.74332898Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do eche dengxian;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 18700,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-02-10T01:59:03.117114088Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
.......
進入當前正在運行的容器
# docker exec -it 容器id /bin/bash
[root@VM-0-4-centos ~]# docker exec -it 12057bc3ef72 /bin/bash
[root@12057bc3ef72 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@12057bc3ef72 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:59 ? 00:00:00 /bin/sh -c while true;do eche dengxian;sleep 1;done
root 1803 0 0 02:14 pts/0 00:00:00 /bin/bash
root 1829 1 0 02:14 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 1830 1803 0 02:14 pts/0 00:00:00 ps -ef
# 方式二
docker attach 容器id
[root@VM-0-4-centos ~]# docker attach 12057bc3ef72
正在執行當前的代碼...
# docker exec # 進入容器后開啟一個新的終端,可以在里面操作
# docker attch # 進入容器正在執行的終端,不會啟動新的行程!
從容器內拷貝檔案到主機中
[root@VM-0-4-centos ~]# docker attach 9d01abc47f10
[root@9d01abc47f10 /]# cd home
[root@9d01abc47f10 home]# touch test.java
# 退出容器
[root@VM-0-4-centos ~]# docker cp 9d01abc47f10:/home/test.java /home
[root@VM-0-4-centos ~]# cd /
[root@VM-0-4-centos /]# cd home
[root@VM-0-4-centos home]# ls
test.java www
# 拷貝是一個手動的程序,之后可以使用 -v 資料卷的技術,可以實作自動拷貝
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258685.html
標籤:其他


