場景一:公司雙十一買了一堆服務器,技術總監讓你給它們一個個都配置上JDK、Mysql、Redis等軟件環境。mysql
你內心小聲嘀咕:「這總監不講武德!「而後你開始一個個去安裝、配置,結果搞了一天都沒有配置好。linux
到了晚上10點,總監對你說:「你到底行不行?我勸你好自爲之!「nginx
場景二: 你和公司同事共用一臺服務器進行開發,中間忽然你倆的程序都掛了。程序員
同事很惱火,拿着鍵盤指着你說:「怪不得總監昨晚勸你好自爲之,我看你就是不行!」redis
你一聽不行,腦子就炸了!「男人不能說不行啊!「你上去就給了他一拳。sql
那麼有了Docker之後,以上兩個場景會變成怎樣?mongodb
場景一變爲:你在Docker Hub(鏡像倉庫)上下載了這些軟件的鏡像,而後
在容器裏經過 docker run這個簡單的命令一個個運行它們,不到5分鐘你就所有配置好了。docker
總監對你連連點頭:「小夥子不錯嘛,也是一個老Docker了!「shell
場景二變爲:你和同事的程序分別運行在兩個互不干擾的容器裏,即使同事的程序掛了,你的程序依然毫髮無損。同事今後對你另眼相看。數據庫
Docker官網的圖標是一個鯨魚身上有一堆小箱子,這些小箱子就是容器。
到這裏你可能想問?爲何你一直在說容器?爲何容器技術愈來愈重要?爲何Docker這麼火?
「由於Docker它超級輕啊!「
在容器技術以前,業內用的最多的就是虛擬機技術,其中虛擬技術的表明就是VMware。
那麼什麼是虛擬技術?其實就是在你的電腦上先安裝一個軟件例如VMware,而後再在這個軟件上安裝一堆「子電腦」,這些「子電腦」就是虛擬機,它們通常經常使用的是CentOS。
在這些子電腦上,你能夠運行eclipse、網易雲音樂等各類軟件。你還能夠在一臺虛擬機上用navicat鏈接另一臺虛擬機上的Mysql。
想必各位在大學裏面學習Linux這門課的時候,都學過怎樣在電腦上裝Linux系統。
首先是在你的電腦上裝VMware,事先老師可能給大家找了一個綠色破解版的,因此裝起來並非很難。
可是等到裝CentOS的時候,有的同窗就崩潰了,一節課一個班裏可能最多隻有一半人裝成功了,有的甚至到大學畢業了尚未成功過。圖片
虛擬機技術雖然能夠在一臺真實的電腦上經過一個軟件裝一堆虛擬的「子電腦」,可是它安裝起來太麻煩了,並且啓動起來超級超級慢,最重要的是特別卡,很佔內存。關鍵時刻,容器技術的主角Docker閃亮登場。
首先咱們來看一張虛擬機技術和Docker容器技術的對比圖
由上圖可知:就是由於Docker啓動超級快,佔用內存超級低,因此它纔會愈來愈受歡迎。
鏡像:一個鏡像表明一個應用環境,他是一個只讀的文件,如 mysql鏡像等。
容器:鏡像每次運行以後就是產生一個容器,就是正在運行的鏡像,運行鏡像其實就是安裝軟件。
倉庫:用來存放鏡像的位置,相似於maven倉庫,也是鏡像下載和上傳的位置。
舉個例子:
在好久以前程序員開發完一個軟件只能經過開發工具把軟件安裝在手機上,且不說軟件安裝起來有多麻煩,有的手機還不兼容,大多數人都不能共享這個軟件。
結果有一天有一個牛人搞了一個應用商店,全部的程序員只要遵照必定的規範,他們均可以把本身開發的軟件打包發佈到應用商店上。而後全部人均可以在這個應用商店上下載軟件。
在剛纔的例子裏,全部的程序員打包發佈的軟件就是「Docker鏡像」,而應用商店就是Docker的倉庫。咱們在手機上運行的軟件就是Docker容器。
說白了就是全部人均可以發佈Docker鏡像到Docker倉庫裏,均可以從Docker倉庫裏下載別人發佈的鏡像,而後將這些鏡像一運行就成爲了一個Docker容器。這個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
Docker經常使用命令主要包含鏡像命令、容器命令以及進入容器內部與軟件環境的交互命令。
-a 列出全部鏡像 -q 只顯示鏡像id
[root@eclipse ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f35646e83998 8 weeks ago 133MB
[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]
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
-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
--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
-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 ~]#
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 ~]#
[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 ~]#
[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 ~]#
-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
-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:/#
[root@eclipse ~]# docker exec -it cb5 /bin/bash root@cb5814efd6da:/# exit exit [root@eclipse ~]#
docker save 鏡像名 -o 名稱.tar
docker load -i 名稱.tar
docker pull mysql
這裏設置帳戶和密碼都是root
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d 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>
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
docker pull mongo
其實就是安裝Mongo。-v後面的參數表示把數據文件掛載到宿主機的路徑,-p把mongo端口映射到宿主機的指定端口,--auth表示鏈接mongodb須要受權。
$ docker run -d --name mongo -p 27017:27017 mongo --auth
$ docker exec -it mongo mongo admin # 建立admin管理員帳戶 > db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); # 對admin進行身份認證 > db.auth('admin', '123456')
docker run -d -p 27017:27017 -v /root/mongo/data:/data/db --name mymongo mongo
微信公衆號:eclipse編程。專一於編程技術分享,堅持終身學習。