Docker--簡介
關于Docker我們來看一下百度百科給出的介紹:
Docker 是一個開源的應用容器引擎饵蒂,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上祠乃,也可以實現虛擬化磅轻。容器是完全使用沙箱機制寂祥,相互之間不會有任何接口。
上面提到Dockers是個容器能實現虛擬化藕夫,那么我們看一下Docker與虛擬機的區(qū)別
[圖片上傳失敗...(image-e9d569-1543800377211)]
我們能看出docker容器要比傳統的虛擬機要輕,傳統的虛擬機需要創(chuàng)建一個guest系統環(huán)境枯冈,docker不需要他可以依賴本地的系統環(huán)境毅贮,很輕。Docker的容器本身不需要額外創(chuàng)建虛擬機管理系統霜幼,因此你可以啟動多套Docker容器嫩码,這樣就可以充分發(fā)揮主機服務器的物理資源,也可以降低因為采購服務器licenses而帶來的額外成本罪既。
Docker核心--鏡像和容器
首先我們來看一下官方給出的解釋:
A container is launched by running an image. An image is an executable package that includes everything needed to run an application--the code, a runtime, libraries, environment variables, and configuration files.
A container is a runtime instance of an image--what the image becomes in memory when executed (that is, an image with state, or a user process). You can see a list of your running containers with the command,
docker ps
, just as you would in Linux.
鏡像包含了一系列可運行的代碼铸题、架包、環(huán)境變量琢感、配置文件等等的可執(zhí)行的包丢间,而容器的創(chuàng)建需要一個可運行的鏡像,容器就是一個運行時鏡像的實例驹针。
我們再來看下這張圖:
[圖片上傳失敗...(image-777eb2-1543800081343)]
一般認為烘挫,沒有繼承自其他鏡像的鏡像為Base Image,也就是rootfs,圖片中的bootfs和rootfs兩個概念,來源于Linux柬甥,鑒于筆者對Linux只停留在應用的情況下饮六,對于bootfs與rootfs就不做更深入的解釋,下面我們來講一下docker運行的基本原理苛蒲。
- Docker鏡像是由文件系統疊加而成献酗。最低端是一個引導文件系統蚕脏,即bootfs。當一個容器啟動后,它將會被移到內存中讯蒲,而引導文件系統則會被卸載侈玄,以留出更多的內存供initrd磁盤鏡像使用非凌。
- Docker鏡像的第二層是root文件系統rootfs秸应,它位于引導文件系統之上。rootfs可以是一種或多種操作系統蔫浆。
- 在Docker里殖属,root文件系統永遠只能是只讀狀態(tài),并且Docker利用聯合加載技術又會在root文件系統層上加載更多的只讀文件系統克懊。聯合加載指的是一次同時加載多個文件系統忱辅,但是在外面看起來只能看到一個文件系統七蜘。聯合加載會將各層文件系統疊加到一起,這樣最終的文件系統會包含所有底層的文件和目錄墙懂。
- 當從一個鏡像啟動容器時橡卤,Docker會在該鏡像的最頂層加載一個讀寫文件系統。 當Docker第一次啟動一個容器時损搬,初始的讀寫層是空的碧库。當文件系統發(fā)生變化時,這些變化都會應用到這一層上巧勤。如果修改一個文件嵌灰,這個文件首先會從該讀寫層下面的只讀層復制到該讀寫層。該文件的只讀版本依然存在颅悉,但是已經被讀寫層中的該文件副本所隱藏沽瞭。
- 如此強大的技術之一。每個只讀鏡像層都是只讀的剩瓶,并且以后永遠不會變化驹溃。當創(chuàng)建一個新容器時,Docker會構建出一個鏡像棧延曙,并在棧的最頂端添加一個讀寫層豌鹤。這個讀寫層再加上其下面的鏡像層以及一些配置數據,就構成了一個容器
也就是說鏡像制作好了之后枝缔,是只讀的不可以更改布疙,當進行運行啟動容器是,會在最頂層加載一個讀寫文件系統愿卸,所有的數據都會保存到這個文件系統上面灵临,對底層的鏡像是零浸入的,這也就是說我們能夠將一個application制作成一個鏡像趴荸,這個鏡像是可復用的俱诸,這大大節(jié)省了運維成本,針對一些鏡像赊舶,例如mysql,centos我們直接可以下載鏡像赶诊,直接運行A健!
Docker 基本語法
查看docker 鏡像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
node Node.js is a JavaScript-based platform for s… 6670 [OK]
tomcat Apache Tomcat is an open source implementati… 2191 [OK]
java Java is a concurrent, class-based, and objec… 1905 [OK]
openjdk OpenJDK is an open-source implementation of … 1395 [OK]
ghost Ghost is a free and open source blogging pla… 879 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.28 over A… 373 [OK]
jetty Jetty provides a Web server and javax.servle… 281 [OK]
couchdb CouchDB is a database that uses JSON for doc… 246 [OK] ```
**拉取鏡像**
```root@tuxiaolei:/home/nvshenluoxiaobai# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a5a6f2f73cd8: Pull complete
1ba02017c4b2: Pull complete
33b176c904de: Pull complete
Digest: sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba
Status: Downloaded newer image for nginx:latest
查看本地鏡像列表
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5958914cc558 3 days ago 94.9MB
nginx latest 568c4670fa80 4 days ago 109MB
查看某個鏡像的詳細信息
[
{
"Id": "sha256:5958914cc55880091b005658a79645a90fd44ac6a33abef25d6be87658eb9599",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:f57d1597d038a742dfba6acfaf48b10e6383466eea2aef95d1ee76f32633f959"
],
"Parent": "",
"Comment": "",
"Created": "2018-11-28T23:30:01.179460123Z",
"Container": "dfc3616dd94b0f16f74ad3c738baa37168d6f782685c763391dc1fe5e4fa1569",
"ContainerConfig": {
"Hostname": "dfc3616dd94b",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.10",
"REDIS_VERSION=5.0.2",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.2.tar.gz",
"REDIS_DOWNLOAD_SHA=937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"redis-server\"]"
],
"ArgsEscaped": true,
"Image": "sha256:0d301a3ab4ce5b07faab5375b0a2d09247e337c75a39a0edb6cae3034641ef47",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": [],
"Labels": {}
},
"DockerVersion": "17.06.2-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.10",
"REDIS_VERSION=5.0.2",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.2.tar.gz",
"REDIS_DOWNLOAD_SHA=937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed"
],
"Cmd": [
"redis-server"
],
"ArgsEscaped": true,
"Image": "sha256:0d301a3ab4ce5b07faab5375b0a2d09247e337c75a39a0edb6cae3034641ef47",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": [],
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 94925974,
"VirtualSize": 94925974,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/32d07536d351114ebefc53daff1094e9ca6c37d282b04136eb6e1b9a6affdaab/diff:/var/lib/docker/overlay2/d338e933b9e1877932f2ce4e7ff25bbaf8c30a6fb7ab8ade9497f3bd633daafc/diff:/var/lib/docker/overlay2/bf74e4d9e35815d13204572b9592890ad4b86c853d814dff97930253d6695706/diff:/var/lib/docker/overlay2/c32e23b8e5b5d222f9467a10f41fd33ac41916b1c042304012f85b50f9eef9a7/diff:/var/lib/docker/overlay2/54c65094137a50d0c34363abbb4c29a2dd771f12e70761fae95da3fb5f7daef6/diff",
"MergedDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/merged",
"UpperDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/diff",
"WorkDir": "/var/lib/docker/overlay2/9a0ab9655a90ac0b9bb09bae4e2ff1f725e1d30fccfc9bb0dc2ad66d5c4164f1/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
"sha256:2c1e04fae1f2111671c8ab19fee9d5d69ee29709487cac889385ff4bdb5f081f",
"sha256:94bdf74df564a4f3c84f5854c4496f80915a375662f220c74b649878e781a13e",
"sha256:90d2c5d0209d338573643ca0517731154dcc9c49e50ec9d0857eaddee2d871da",
"sha256:dc682cc939702aa54f3aa457b12f9c572dbc0271f3f6e9023a45657cb075cd8e",
"sha256:bb84a87b243fddbd353bedec71dc3fcb4d0b61ff2f8cc8d64730ede22dad09c9"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
啟動鏡像
基本命令 docker run + 名字(或者imageID或者containerID)
root@tuxiaolei:~$ ps -ef | grep nginx
root 26523 24712 0 17:03 pts/0 00:00:00 docker run nginx
root 26583 26561 0 17:03 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 26650 26583 0 17:03 ? 00:00:00 nginx: worker process
nvshenl+ 26889 26872 0 17:04 pts/1 00:00:00 grep --color=auto nginx
基本命令就講到這里舔痪,其余常用命令在后面的實戰(zhàn)中給出寓调,這里附上docker官方文檔地址
Dockerfile
Dockerfile
定義容器內環(huán)境中發(fā)生的事情。對網絡接口和磁盤驅動器等資源的訪問在此環(huán)境中進行虛擬化锄码,該環(huán)境與系統的其他部分隔離夺英,因此您需要將端口映射到外部世界晌涕,并具體說明要“復制”到哪些文件那個環(huán)境.
?
MAINTAINER love@gmail.com
?
RUN mkdir -p /smart/bin/com.xx.more/smart-gateway
?
WORKDIR /smart/bin/com.xx.more/smart-gateway
?
EXPOSE 9999
?
ADD ./smart-gateway/target/smart-gateway.jar ./
?
CMD java -Djava.security.egd=file:/dev/./urandom -jar smart-gateway.
我們來解讀一下
From
---> 表明當前鏡像所基于的鏡像,我們是個javaweb 項目痛悯,項目依賴于java鏡像
MAINTAINER
---->維護者信息
RUN
---> 運行是命令
WORKDIR
--->工作目錄
EXPOSE
---> 暴露端口余黎,方便鏡像 運行時做映射
ADD
---> 將本地目錄文件加入鏡像
CMD
--->指定啟動容器時執(zhí)行的命令,每個 Dockerfile 只能有一條 CMD 命令载萌。如果指定了多條命令惧财,只有最后一條會被執(zhí)行。如果用戶啟動容器時候指定了運行的命令扭仁,則會覆蓋掉 CMD 指定的命令垮衷。
VOLUME
---> 創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等