簡介:
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有以下幾個部分組成:
-
dockerClient客戶端
-
Docker Daemon守護進程
-
Docker Image鏡像
-
DockerContainer容器
起源:
Docker 是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,源代碼託管在 Github 上, 基於go語言並遵從Apache2.0協議開源。
Docker自2013年以來非常火熱,無論是從 github 上的代碼活躍度,還是Redhat在RHEL6.5中集成對Docker的支持, 就連 Google 的 Compute Engine 也支持 docker 在其之上運行。
一款開源軟件能否在商業上成功,很大程度上依賴三件事 - 成功的 user case(用例), 活躍的社區和一個好故事。 dotCloud 自家的 PaaS 產品建立在docker之上,長期維護且有大量的用戶,社區也十分活躍,接下來我們看看docker的故事。
-
環境管理複雜 - 從各種OS到各種中間件到各種app, 一款產品能夠成功作爲開發者需要關心的東西太多,且難於管理,這個問題幾乎在所有現代IT相關行業都需要面對。
-
雲計算時代的到來 - AWS的成功, 引導開發者將應用轉移到 cloud 上, 解決了硬件管理的問題,然而中間件相關的問題依然存在 (所以openstack HEAT和 AWS cloudformation 都着力解決這個問題)。開發者思路變化提供了可能性。
-
虛擬化手段的變化 - cloud 時代採用標配硬件來降低成本,採用虛擬化手段來滿足用戶按需使用的需求以及保證可用性和隔離性。然而無論是KVM還是Xen在 docker 看來,都在浪費資源,因爲用戶需要的是高效運行環境而非OS, GuestOS既浪費資源又難於管理, 更加輕量級的LXC更加靈活和快速
-
LXC的移動性 - LXC在 linux 2.6 的 kernel 裏就已經存在了,但是其設計之初並非爲雲計算考慮的,缺少標準化的描述手段和容器的可遷移性,決定其構建出的環境難於遷移和標準化管理(相對於KVM之類image和snapshot的概念)。docker 就在這個問題上做出實質性的革新。這是docker最獨特的地方。
安裝: 以docker-ce版本爲例
官方文檔
https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1
按照文檔步驟:
1、卸載舊版本
老版本的Docker被稱爲docker或docker-engine。如果安裝了它們,請卸載它們以及相關的依賴項。
sudo yum remove docker
2、新增一個yum源
使用以下命令設置穩定的存儲庫。即使您想從邊緣或測試存儲庫安裝構建,也總是需要穩定的存儲 庫。
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manage命令找不到 安裝yum-utils
yum -y install yum-utils
默認的yum倉庫 沒有docker的最新版
3、安裝最新版本的Docker CE,或者轉到下一步安裝特定版本:
sudo yum install docker-ce
4、啓動Docker
sudo systemctl start docker
5、docker通過運行hello-world 映像驗證安裝是否正確。
sudo docker run hello-world
6、開機自啓docker
systemctl enable docker
安裝完成
Docker_常用命令
Docker -v |
查看版本 |
Search xxxx |
從hub搜索img |
Pull xxx:tag |
從hub檢出img tag可以到docker官網查看 一般是版本 不帶tag默認是最新版 |
imgaes |
當前已有docker鏡像 |
Rmi |
刪除鏡像 |
PS:
Docker中國 pull速度更快
docker pull registry.docker-cn.com/library/iamges:tag
例如:
docker pull registry.docker-cn.com/library/rabbitmq:3.7-management
容器操作
docker run --name mytomcat -d tomcat:latest |
根據鏡像啓動容器 --name 自定義名稱 -d後臺運行 容器名稱:tag。此操作相當於啓動了一個容器,可以啓動多個 |
docker ps |
查看當前已經運行的容器 |
docker stop xxx |
停止容器 xxx可以是容器id或名稱 |
Docker ps -a |
查看所有容器狀態 |
docker start xxx |
啓動容器 |
Docker rm xxx |
刪除容器 |
docker run -d -p 8080:8080 tomcat |
端口映射 :-p 外部端口:docker端口 |
Docker exec -it xxxxID /bin/bash |
進入容器目錄 |
docker run --name tomcat -p 8080:8080 -v /zm:/usr/local/tomcat/webapps/ROOT -d 容器id |
將容器中的/usr/local/tomcat/webapps/ROOT目錄掛載到容器外部的 zm目錄 |
docker inspect xxxx |
查看容器各參數情況 |
鏡像默認存放docker內部目錄
/var/lib/docker/overlay2/
示例 安裝Mysql:
1、docker search mysql
2、docker pull mysql
3、docker run --name mysql -d mysql
異常 第一次未啓動成功
[root@MiWiFi-R3G-srv ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MiWiFi-R3G-srv ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcc96724d772 mysql "docker-entrypoint.s…" 13 seconds ago Exited (1) 12 seconds ago mysql
[root@MiWiFi-R3G-srv ~]# docker logs mysql
error: database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
正確啓動:
|
指定ROOT密碼 |
高級用法
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql:tag
把主機的/conf/mysql文件夾掛載到 mysqldocker容器的/etc/mysql/conf.d文件夾裏面
改mysql的配置文件就只需要把mysql配置文件放在自定義的文件夾下(/conf/mysql);
指定mysql的一些配置參數:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
Docker打包鏡像:
1、創建Dockerfile文件
內容:
FROM java:8
MAINTAINER zm
add spring-boot-crud-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8082
ENTRYPOINT ["java","-jar","app.jar"]
鏡像爲java 標籤版本爲8
作者爲zm
將spring-boot-crud-0.0.1-SNAPSHOT.jar添加到鏡像中並重命名爲app.jar
運行鏡像 監聽8082端口
啓動是運行java -jar
2、編譯鏡像
docker build -t boot/dockerimg ./
boot是前綴 dockerimg 含有dockerfile和項目的目錄
./ 表示dockerfile的文件目錄
3、打包鏡像到tar
docker save 實例ID -o >./myapp.tar
或
docker save myapp:latest > ./myapp.tar
4、加載鏡像
Docker load < ./myapp.tar