一、認識Docker
Docker是什么?
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協(xié)議開源。
Docker 可以讓開發(fā)者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker的應用場景
- Web 應用的自動化打包和發(fā)布。
- 自動化測試和持續(xù)集成、發(fā)布。
- 在服務型環(huán)境中部署和調整數據庫或其他的后臺應用。
- 從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環(huán)境。
Docker的優(yōu)點
使用Docker,配置工作從資源管理中分離了出來,而部署工作則不值一提:執(zhí)行docker run,環(huán)境的鏡像會被拉取下來并準備運行,所消耗的資源更少并且是內含的,因此不會干擾其他環(huán)境。
Docker 架構
Docker 包括三個基本概念:
- 鏡像(Image):Docker 鏡像(Image),就相當于是一個 root 文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)。
- 容器(Container):鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。
-
倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創(chuàng)建Docker容器。
Docker 容器通過 Docker 鏡像來創(chuàng)建。
容器與鏡像的關系類似于面向對象編程中的對象與類。
二、Docker手動安裝
前置文章:??linux云服務器配置及Docker安裝Mysql、Redis
Docker基本安裝
#卸載舊版本
sudo apt-get remove docker docker-engine docker.io
# 安裝包更新
sudo apt-get update
# 安裝依賴
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 加Docker官方GPG key
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#設置穩(wěn)定版的Docker倉庫
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#安裝 docker-ce
sudo apt-get install -y docker-ce
#查看是否安裝成功
docker version
將用戶加入 docker 用戶組
出于安全考慮,一般 Linux 系統(tǒng)上不會直接使用 root 用戶。
因此,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組。
#建立 docker 組:
sudo groupadd docker
# 將當前用戶加入 docker 組:
sudo usermod -aG docker $USER
#更新用戶組
newgrp docker
#測試docker命令是否可以使用sudo正常使用
docker ps
三、Docker常用命令
Docker 命令大全
1、基礎命令
docker version #查看docker的版本信息
docker info #查看docker的系統(tǒng)信息
docker 命令 --help #幫助命令(可查看可選的參數)
docker COMMAND --help
2、鏡像命令
1.docker images:查看本地主機的所有鏡像
-
#解釋:
1.REPOSITORY 鏡像的倉庫源
2.TAG 鏡像的標簽
3.IMAGE ID 鏡像的id
4.CREATED 鏡像的創(chuàng)建時間
5.SIZE 鏡像的大小
-
可選參數
- a/--all
列出所有鏡像- q/--quiet
只顯示鏡像的id
2.docker search:搜索鏡像
docker search tomcat
3.docker pull 鏡像名[:tag] :下載鏡像
ubuntu@VM-8-4-ubuntu:~$ docker pull tomcat:8
8: Pulling from library/tomcat
9d19ee268e0d: Pull complete
f2b566cb887b: Pull complete
b375e6654ef5: Pull complete
19452d1108a6: Pull complete
b82f37793aff: Pull complete
05e2d15aa7f6: Pull complete
c13582f40375: Pull complete
Digest: sha256:f7ec6fbad076aeb902b8b3f0b13fa5296882759d7bd21d7ef7017c76c0bd4f20
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8
docker pull tomcat:9
4.docker rmi : 分層刪除
docker rmi tomcat:9
docker rmi tomcat:8
docker rm 容器id
#刪除指定的容器,不能刪除正在運行的容器
強制刪除使用docker rm -f
5.docker ps : 列出當前正在運行的容器(※重要)
-a
# 列出所有容器 用的非常多的一個參數-n=?
# 顯示最近創(chuàng)建的n個容器-q
# 只顯示容器的編號
6.docker start / docker stop 容器id :啟動和停止容器命令
docker start 容器id #啟動容器
docker restart 容器id #重啟容器
docker stop 容器id #停止當前運行的容器
docker kill 容器id #強制停止當前容器(了解)
7.docker run:容器運行命令
Docker run 命令用來創(chuàng)建一個新的容器并運行,相當于 docker create和docker start的組合。
docker run [可選參數] image
#參數說明
--name="名字" 指定容器名字
-d 后臺方式運行
-it 使用交互方式運行,進入容器查看內容
-p 指定容器的端口(-p ip:主機端口:容器端口 配置主機端口映射到容器端口-p 主機端口:容器端口-p 容器端口)
-p 3306:3306
-P 隨機指定端口(大寫的P)
先查看端口是否被占用
lsof -i:6379
docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "mimapassword" --appendonly yes
8.docker logs 容器名:查看容器內部的日志
如果當前容器中得程序出現了一些bug, 此時會用docker logs 容器名
去查看容器內部的日志
9.docker top 容器名稱:查看容器中進程信息
docker top 容器名稱
10.docker exec : 進入當前正在運行的容器 (※重要)
docker exec 進入容器后開啟一個新的終端,可以在里面操作
docker容器系統(tǒng)的重要特點: 如果當前容器系統(tǒng)中沒有任何一個正在運行的程序, 該系統(tǒng)會被自動關機退出
輸入exit
后就會退出容器
- -d :后臺運行容器,并返回容器ID;
- -i :以交互模式運行容器,通常與 -t 同時使用;
- -t :為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
- -p: 指定端口映射,格式為:主機(宿主)端口:容器端口
- –name=“nginx-lb”: 為容器指定一個名稱;
- –volume , -v: 綁定一個卷
具體使用詳見本篇文章【四、數據卷安裝mysql】
11.docker cp :用于容器與主機之間的數據拷貝
12.docker system df :查看docker鏡像,容器,數據卷的磁盤占用情況
發(fā)現其中數據卷占用空間很大, 并且可回收空間也大,使用命令回收不再使用的數據卷
docker volume prune
三、Docker安裝其他容器(普通安裝)
1、使用docker安裝mysql
注意:password 改為自己想要設置的數據庫密碼
docker run --name some-secret-mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.7 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4 --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
當2-3分鐘之后, 輸入docker ps
回車
查看到類似內容表示mysql安裝成功
b8942c6f086a mysql:5.7 "docker-entrypoint.s…" 17 seconds ago Up 11 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp some-secret-mysql
- 進入MySQL8
docker exec -it some-mysql8 bash
mysql -uroot -proot
mysql -uroot -pmimapassword
-
設置遠程連接
navicate for mysql 遠程連接 use mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; 修改密碼為永不過期 ALTER USER 'root'@'%' IDENTIFIED BY 'Jw1182-0c1' PASSWORD EXPIRE NEVER; 修改密碼并指定加密規(guī)則為 mysql_native_password ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Jw1182-0c1'; 刷新權限 FLUSH PRIVILEGES; 這樣就可以遠程連接數據庫了;
ls /var/lib/mysql
查看容器目錄:數據庫和數據卷存放在/var/lib/mysql
目錄下
同時云服務器需要保證已經開放了3306端口。
之后可以借助第三方工具去測試連接mysql。
關于數據卷安裝mysql請看本篇文章【四、使用數據卷安裝mysql(重要)】
2、使用docker安裝redis
先查看端口是否被占用
lsof -i:6379
docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "mimapassword" --appendonly yes
docker ps
關于Redis詳見文章【redis】(一)使用docker安裝redis、常用五大基本數據類型、Jedis操作Redis、Spring整合Redis
【redis】(二)docker安裝redis、非docker安裝,集群啟動
3、使用docker安裝clickhouse
docker run -dit --name some-clickhouse -e CLICKHOUSE_DB=test1 -e CLICKHOUSE_USER=root -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password123 -p 9000:9000 -p 8123:8123 clickhouse/clickhouse-server
用戶名root,密碼password123,連接端口8123(記得防火墻開放端口)
關于clickhouse詳見文章ClickHouse入門及安裝、OLAP、列式數據庫
四、使用數據卷安裝(重要)
數據卷
注:因為mysql容器一旦銷毀,數據庫也就隨之銷毀,為了解決這個問題,docker官方提出了容器數據卷技術,就是在宿主機上新建一些目錄與容器內的目錄映射,當容器銷毀時,宿主機上的目錄文件不會消失,依然存在。
卷就是目錄或文件,存在于一個或多個容器中,由Docker掛載到容器,但卷不屬于聯(lián)合文件系統(tǒng)(Union FileSystem),因此能夠繞過聯(lián)合文件系統(tǒng)提供一些用于持續(xù)存儲或共享數據的特性:。
卷的設計目的就是數據的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
數據卷是被設計用來持久化數據的,它的生命周期獨立于容器,Docker 不會在容器被刪除后自動刪除數據卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數據卷 。如果需要在刪除容器的同時移除數據卷??梢栽趧h除容器的時候使用 docker rm -v
這個命令。
數據卷的特點:
- 數據卷可在容器之間共享或重用數據
- 卷中的更改可以直接生效
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續(xù)到沒有容器使用它為止
無主的數據卷可能會占據很多空間,要清理請使用以下命令
$ docker volume prune
運行mysql容器,同時創(chuàng)建容器卷
docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
-
–name some-mysql8: 為容器指定一個名稱;
–name some-mysql8
:指定容器名字為some-mysql8,也可以不指定,不指定會給容器默認制定一個名字 -
-d: 后臺運行容器,并返回容器ID;
-
–volume , -v: 綁定一個卷
-v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql
:對宿主機數據庫目錄與容器數據庫目錄進行映射掛載。意思就是將mysql容器中的/var/lib/mysql
(這個是數據庫所有數據信息文件)映射到宿主機/it23/mysql8datadir
里面。 -
-p: 指定端口映射,格式為:主機(宿主)端口:容器端口 將宿主機3306端口與容器3306端口做映射
-
-e : 設置環(huán)境變量;
MYSQL_ROOT_PASSWORD
為mysql的root用戶設置密碼。
查看容器對應元數據docker inspect 容器id
,可以在Mounts節(jié)點查看建立的數據卷信息。
此時可以直接從宿主機查看到數據庫222a里的內容
然后刪除容器,宿主機中的相關文件夾依舊存有數據庫
再次使用相同命令安裝mysql8容器,重新安裝之后,新數據庫里面依舊會存有數據(此時數據庫文件由宿主機→容器)
docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
- 第一次,啟動mysql容器時,宿主機的
/it23/mysql8datadir
是空的。是docker容器中的/var/lib/mysql
會自動映射到宿主機/it23/mysql8datadir
,讓宿主機有了對應的文件信息。 - 第二次,刪除了docker容器,這時宿主機的
/it23/mysql8datadir
是有文件的。然后創(chuàng)建了mysql容器,并設置對應的映射關系。這時,宿主機的/it23/mysql8datadir
文件映射到了容器中,保持數據一致。
- 當指定-v參數時,在啟動容器時會首先檢查宿主機中是否有數據文件:
- 如果有的話,則判斷是否是數據庫文件,如果符合數據庫文件系統(tǒng)的文件目錄。那么則會使用;如果不符合數據庫文件系統(tǒng)的文件目錄,那么則會無法啟動,直接報錯。
- 如果沒有的話則會初始化數據庫文件,生成一個干凈的數據庫系統(tǒng)并進行宿主機和docker容器間的互通。
根據匿名數據卷恢復數據
刪除當前容器并且刪除文件夾mysql8datadir,重新創(chuàng)建mysql8容器(不使用數據卷命令)。
docker run --name some-mysql8 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
在當前mysql容器中新建一個數據庫newworld
,并新建一張表sun
,在表中插入一條數據來模擬舊的數據庫數據。
匿名掛載就是在指定數據卷的時候,不指定容器路徑對應的主機路徑,這樣對應映射的主機路徑就是默認的路徑/var/lib/docker/volumes/
中自動生成一個隨機命名的文件夾。
使用docker volume ls
查看所有的數據卷volume的情況, VOLUME NAME
這里的值是真實存在的目錄。
這些數據卷稱為匿名數據卷,可以根據時間來選擇數據卷,然后根據數據卷ID查看詳細內容。
docker inspect 數據卷id
查看該數據卷的詳細信息,找到數據卷所在文件夾。
切換到root用戶然后訪問數據卷所在文件夾。根據時間來選擇數據卷
進入該目錄下,發(fā)現有一個_data
文件夾,再次切換到該文件夾里面進行查看,發(fā)現有剛剛創(chuàng)建的數據庫newworld
使用pwd
獲取當前目錄,然后切換回普通用戶將該目錄復制到新文件夾中。
sudo cp -r /var/lib/docker/volumes/b6aaa127bc2071bcc94c51b6fcc0be33ffa23c32f10d7ea20c586f84bad9d9cb/_data mysql8datadir
再次使用數據卷命令創(chuàng)建新的mysql8容器
docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4
匿名數據卷會占用一些磁盤空間,使用
docker system df
查看。發(fā)現其中數據卷占用空間很大, 并且可回收空間也大,使用命令
docker volume prune
回收不再使用的數據卷。
五、制作鏡像
鏡像制作
docker pull ubuntu:18.04
docker run --name some-jdk -dit ubuntu:18.04 /bin/bash
docker top some-jdk
發(fā)現此時運行了一個黑窗口程序
進入容器后查看當前系統(tǒng)版本uname -a
首先apt update -y
apt serach openjdk
安裝jre-headless: apt install -y openjdk-8-jdk-headless
成功安裝:java -version
生成鏡像docker commit some-jdk yolo01/openjdk-jdk:8
查看鏡像docker images
刪除剛剛的容器
docker run --name some-jdk2 yolo01/openjdk-jdk:8 /bin/bash
推送到遠程
登陸docker賬號docker login
文章來源:http://www.zghlxwxcb.cn/news/detail-790604.html
docker push yolo01/openjdk-jdk:8
文章來源地址http://www.zghlxwxcb.cn/news/detail-790604.html
到了這里,關于【超全面】Docker使用:基本安裝 + 常用命令 + 安裝mysql、redis、clickhouse + 使用數據卷安裝 + 制作鏡像的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!