人均年薪50萬以上,docker到底是什麼?為什麼這麼火?
為什麼要使用Docker?
場景一:公司雙十一買了一堆伺服器,技術總監讓你給它們一個個都配置上JDK、Mysql、Redis等軟體環境。
你心裡小聲嘀咕:「這總監不講武德!「然後你開始一個個去安裝、配置,結果搞了一天都沒有配置好。
到了晚上10點,總監對你說:「你到底行不行?我勸你好自為之!「
場景二: 你和公司同事共用一台伺服器進行開發,中間突然你倆的程式都掛了。
同事很惱火,拿著鍵盤指著你說:「怪不得總監昨晚勸你好自為之,我看你就是不行!」
你一聽不行,腦子就炸了!「男人不能說不行啊!「你上去就給了他一拳。
那麼有了Docker以後,以上兩個場景會變成怎樣?
場景一變為:你在Docker Hub(鏡像倉庫)上下載了這些軟體的鏡像,然後
在容器里通過 docker run這個簡單的命令一個個運行它們,不到5分鐘你就全部配置好了。
總監對你連連點頭:「小夥子不錯嘛,也是一個老Docker了!「
場景二變為:你和同事的程式分別運行在兩個互不干擾的容器里,即便同事的程式掛了,你的程式依然毫髮無損。同事從此對你刮目相看。
01 什麼是 Docker
1. Docker的英文解釋是:容器。你可以把它想像為運輸船上的集裝箱,它們互相隔離、互不干擾。
Docker官網的圖標是一個鯨魚身上有一堆小箱子,這些小箱子就是容器。
到這裡你可能想問?為什麼你一直在說容器?為什麼容器技術越來越重要?為什麼Docker這麼火?
「因為Docker它超級輕啊!「
在容器技術之前,業內用的最多的就是虛擬機技術,其中虛擬技術的代表就是VMware。
那麼什麼是虛擬技術?其實就是在你的電腦上先安裝一個軟體例如VMware,然後再在這個軟體上安裝一堆「子電腦」,這些「子電腦」就是虛擬機,它們一般常用的是CentOS。
在這些子電腦上,你可以運行eclipse、網易雲音樂等各種軟體。你還可以在一台虛擬機上用navicat連接另外一台虛擬機上的Mysql。
想必各位在大學裡面學習Linux這門課的時候,都學過怎樣在電腦上裝Linux系統。
首先是在你的電腦上裝VMware,事先老師可能給你們找了一個綠色破解版的,所以裝起來並不是很難。
但是等到裝CentOS的時候,有的同學就崩潰了,一節課一個班裡可能最多只有一半人裝成功了,有的甚至到大學畢業了還沒有成功過。圖片
虛擬機技術雖然可以在一台真實的電腦上通過一個軟體裝一堆虛擬的「子電腦」,但是它安裝起來太麻煩了,而且啟動起來超級超級慢,最重要的是特別卡,很占記憶體。關鍵時刻,容器技術的主角Docker閃亮登場。
首先我們來看一張虛擬機技術和Docker容器技術的對比圖
由上圖可知:就是因為Docker啟動超級快,佔用記憶體超級低,所以它才會越來越受歡迎。
2. Docker的核心
鏡像:一個鏡像代表一個應用環境,他是一個只讀的文件,如 mysql鏡像等。
容器:鏡像每次運行之後就是產生一個容器,就是正在運行的鏡像,運行鏡像其實就是安裝軟體。
倉庫:用來存放鏡像的位置,類似於maven倉庫,也是鏡像下載和上傳的位置。
舉個例子:
在很久之前程式設計師開發完一個軟體只能通過開發工具把軟體安裝在手機上,且不說軟體安裝起來有多麻煩,有的手機還不兼容,大多數人都不能共享這個軟體。
結果有一天有一個牛人搞了一個應用商店,所有的程式設計師只要遵守一定的規範,他們都可以把自己開發的軟體打包發布到應用商店上。然後所有人都可以在這個應用商店上下載軟體。
在剛才的例子里,所有的程式設計師打包發布的軟體就是「Docker鏡像」,而應用商店就是Docker的倉庫。我們在手機上運行的軟體就是Docker容器。
說白了就是所有人都可以發布Docker鏡像到Docker倉庫里,都可以從Docker倉庫里下載別人發布的鏡像,然後將這些鏡像一運行就成為了一個Docker容器。這個Docker容器裡面是一個配置好的軟體環境。
02 安裝Docker
1. 卸載之前的Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安裝Docker依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
設置docker的yum源
yum-config-manager --add-repo //download.docker.com/linux/centos/docker-ce.repo
安裝最新版本的的Docker
sudo yum install docker-ce docker-ce-cli containerd.io
安裝完成之後查看Docker的版本:docker version
[root@eclipse ~]# docker version
Client: Docker Engine - Community
Version: 20.10.0
API version: 1.41
Go version: go1.13.15
Git commit: 7287ab3
Built: Tue Dec 8 18:57:35 2020
OS/Arch: linux/amd64
Context: default
Experimental: true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
因為Docker鏡像倉庫的伺服器在國外,由於網路等一些其他原因我們訪問起來會比較慢,所以這裡需要配置docker的阿里雲鏡像加速服務
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["//lz2nib3q.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
然後重啟Docker
sudo systemctl restart docker
配置完之後查看docker的阿里雲鏡像是否生效
[root@eclipse ~]# docker info
Client:
Context: default
Debug Mode: false
Experimental: false
Insecure Registries:
.....................
127.0.0.0/8
Registry Mirrors:
//lz2nib3q.mirror.aliyuncs.com/
Live Restore Enabled: false
03 Docker常用命令
Docker常用命令主要包含鏡像命令、容器命令以及進入容器內部與軟體環境的交互命令。
1 鏡像命令
1.1 查看所有鏡像 docker images
-a 列出所有鏡像 -q 只顯示鏡像id
[root@eclipse ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f35646e83998 8 weeks ago 133MB
1.2 搜索鏡像 docker search 鏡像名
[root@eclipse ~]# docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8843 [OK]
bitnami/redis Bitnami Redis Docker Image 168 [OK]
sameersbn/redis 82 [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0 72
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 48 [OK]
1.3.從倉庫下載鏡像
docker pull 鏡像名
[root@eclipse ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
852e50cd189d: Pull complete
29969ddb0ffb: Pull complete
a43f41a44c48: Pull complete
5cdd802543a3: Pull complete
b79b040de953: Pull complete
938c64119969: Pull complete
7689ec51a0d9: Pull complete
a880ba7c411f: Pull complete
984f656ec6ca: Pull complete
9f497bce458a: Pull complete
b9940f97694b: Pull complete
2f069358dc96: Pull complete
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
1.4.刪除鏡像 docker rmi 鏡像名
-f 強制刪除
[root@eclipse ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest dd7265748b5d 2 weeks ago 545MB
nginx latest f35646e83998 8 weeks ago 133MB
[root@eclipse ~]# docker rmi -f mysql
2 容器命令
2.1 運行容器 docker run 鏡像名
–name 為容器起一個別名 -d 在後台啟動容器 -p 對外暴露埠號:容器埠號
[root@eclipse ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest dd7265748b5d 2 weeks ago 545MB
nginx latest f35646e83998 8 weeks ago 133MB
[root@eclipse ~]# docker run -d -p 3306:3306 mysql
2.2 查看運行的容器 docker ps
-a 正在運行的以及歷史運行過的容器 -q 只顯示容器編號
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@eclipse ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10fddd372a62 mysql "docker-entrypoint.s…" 6 minutes ago Exited (1) 6 minutes ago strange_maxwell
844ff32beda2 42a1947ab396 "/docker-entrypoint.…" 6 weeks ago Exited (0) 5 weeks ago inspiring_ishizaka
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Exited (0) 6 weeks ago frosty_keller
[root@eclipse ~]# docker ps -a -q
10fddd372a62
844ff32beda2
cb5814efd6da
[root@eclipse ~]#
2.3 開啟|重啟|停止容器
docker start 容器名或者容器id --------------- 開啟容器
docker restart 容器名或者容器id --------------- 重啟容器
docker stop 容器名或者容器id ------------------ 停止容器運行
docker kill 容器名或者容器id ------------------ 立即停止容器運行
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8634a3f49298 nginx "/docker-entrypoint.…" 22 seconds ago Up 22 seconds 0.0.0.0:80->80/tcp admiring_taussig
[root@eclipse ~]# docker stop 863
863
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@eclipse ~]# docker start 863
863
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8634a3f49298 nginx "/docker-entrypoint.…" 52 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp admiring_taussig
[root@eclipse ~]#
2.4 刪除容器 docker rm -f 容器id或者容器名
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8634a3f49298 nginx "/docker-entrypoint.…" 2 minutes ago Up About a minute 0.0.0.0:80->80/tcp admiring_taussig
[root@eclipse ~]# docker rm -f 863
863
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@eclipse ~]#
2.5查看容器內進程 docker top 容器id或者容器名
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Up 29 seconds 80/tcp frosty_keller
[root@eclipse ~]# docker top cb5
UID PID PPID C STIME TTY TIME CMD
root 11243 11223 0 22:21 ? 00:00:00 nginx: master process nginx -g daemon off;
101 11288 11243 0 22:21 ? 00:00:00 nginx: worker process
[root@eclipse ~]#
2.6查看容器的運行日誌 docker logs 容器id或容器名
-t 引入時間戳 -f 跟隨最新的日誌列印 –tail 數字 顯示最後多少條
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Up 2 minutes 80/tcp frosty_keller
[root@eclipse ~]# docker logs cb5 -t -f --tail 5
2020-12-10T14:21:32.392176888Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2020-12-10T14:21:32.399762487Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2020-12-10T14:21:32.402023731Z 10-listen-on-ipv6-by-default.sh: error: IPv6 listen already enabled
2020-12-10T14:21:32.404200667Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
2020-12-10T14:21:32.413931054Z /docker-entrypoint.sh: Configuration complete; ready for start up
3 進入容器內部執行命令
3.1 進入容器內 docker exec 容器id
-i 以交互模式運行容器 -t 分配終端窗口 /bin/bash
傳統模式下我們安裝完軟體之後可以直接進入到它的安裝目錄下,然後執行這個軟體的相關命令。
使用Docker之後,運行的Docker容器裡面包含了一個軟體環境,所以我們需要先進入到容器裡面的軟體環境內部,然後才能執行這個軟體的相關命令。
[root@eclipse ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb5814efd6da nginx "/docker-entrypoint.…" 6 weeks ago Up 16 minutes 80/tcp frosty_keller
[root@eclipse ~]# docker exec -it cb5 /bin/bash
root@cb5814efd6da:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@cb5814efd6da:/#
3.2退出容器 exit
[root@eclipse ~]# docker exec -it cb5 /bin/bash
root@cb5814efd6da:/# exit
exit
[root@eclipse ~]#
3.3我們可以將鏡像打成壓縮包
docker save 鏡像名 -o 名稱.tar
3.4我們還可以載入鏡像
docker load -i 名稱.tar
04 Docker安裝常用軟體
1安裝mysql
1.1 拉取mysql鏡像
docker pull mysql
1.2 運行mysql服務
這裡設置賬戶和密碼都是root
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
1.3 進入mysql容器
docker exec -it 容器id /bin/bash
[root@eclipse ~]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
977b216cf344257d268ee0cf4e5f20d892bb6619787f64c5791bc5d4a4309af4
[root@eclipse ~]# docker exec -it 977 /bin/bash
root@977b216cf344:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.22 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
1.4 將容器數據位置與宿主機位置掛載保證數據安全
docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
2 安裝MongoDB資料庫
2.1 拉取Mongo鏡像
docker pull mongo
2.2 運行MongoDB鏡像
其實就是安裝Mongo。-v後面的參數表示把數據文件掛載到宿主機的路徑,-p把mongo埠映射到宿主機的指定埠,–auth表示連接mongodb需要授權。
$ docker run -d --name mongo -p 27017:27017 mongo --auth
2.3 以admin身份進入到mongo內部
$ docker exec -it mongo mongo admin
# 創建admin管理員賬戶
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 對admin進行身份認證
> db.auth('admin', '123456')
2.4 將mongoDB中數據目錄映射到宿主機中
docker run -d -p 27017:27017 -v /root/mongo/data:/data/db --name mymongo mongo
2.5 連接Mongo
微信公眾號:eclipse編程。專註於編程技術分享,堅持終身學習。