人均年薪50萬以上,docker究竟是什麼?爲何這麼火?

爲何要使用Docker?

場景一:公司雙十一買了一堆服務器,技術總監讓你給它們一個個都配置上JDK、Mysql、Redis等軟件環境。mysql

你內心小聲嘀咕:「這總監不講武德!「而後你開始一個個去安裝、配置,結果搞了一天都沒有配置好。linux

到了晚上10點,總監對你說:「你到底行不行?我勸你好自爲之!「nginx

場景二: 你和公司同事共用一臺服務器進行開發,中間忽然你倆的程序都掛了。程序員

同事很惱火,拿着鍵盤指着你說:「怪不得總監昨晚勸你好自爲之,我看你就是不行!」redis

你一聽不行,腦子就炸了!「男人不能說不行啊!「你上去就給了他一拳。sql

那麼有了Docker之後,以上兩個場景會變成怎樣?mongodb

場景一變爲:你在Docker Hub(鏡像倉庫)上下載了這些軟件的鏡像,而後
在容器裏經過 docker run這個簡單的命令一個個運行它們,不到5分鐘你就所有配置好了。docker

總監對你連連點頭:「小夥子不錯嘛,也是一個老Docker了!「shell

場景二變爲:你和同事的程序分別運行在兩個互不干擾的容器裏,即使同事的程序掛了,你的程序依然毫髮無損。同事今後對你另眼相看。數據庫

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 https://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": ["https://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:
  https://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編程。專一於編程技術分享,堅持終身學習。

相關文章
相關標籤/搜索