(1)隔離php
- 經過cgroup(隔離和跟蹤資源的使用)& namespace(組與組之間隔離)來實現輕量級的進程隔離
- 對於容器中運行的進程來講,本身獨佔了一個系統
- 容器間網絡,文件及其餘資源都互相隔離
(2)版本與依賴html
- 傳統模式下,多個不一樣環境或版本的項目須要部署在不一樣機器上,部署與後期維護管理複雜繁瑣。
- 使用Docker,經過多個不一樣版本或者環境的鏡像,能夠同時運行在一臺機器上互不干擾,部署與後期維護簡單方便。
(3)分發與使用mysql
- 鏡像能夠經過導入,導出,上傳到鏡像倉庫等多種方式進行分發
- 在啓動了Docker的系統上直接使用docker run便可啓動鏡像,無需特別配置。
(4)擴容linux
- 容器擴容簡單方便
- 擴容節點只需安裝並啓動Docker便可
(5)鏡像製做nginx
- 鏡像的靈魂Dockerfile
- 使用Dockerfile進行指令控制
- 基於Linux命令,易於理解,快速上手
- 易於定製與修改
最小化安裝Centos7.5,關閉防火牆和selinuxweb
[root@Docker ~]# yum -y install dockersql
首先清理掉yum安裝的docker標準版
這裏有兩種方式docker
第一種清理docker方法
:數據庫
[root@Docker ~]# yum -y remove dockerjson
第一種清理docker方法
:
[root@Docker ~]# yum history list #查看yum安裝的歷史列表
[root@Docker ~]# yum history info 16 #查看yum歷史安裝ID爲6的安裝信息
[root@Docker ~]# yum -y history undo 16 #進行yum安裝操做回退
安裝Docker的CE社區版
安裝依賴包
[root@Docker ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
添加docker的CE版本的yum源配置文件
[root@Docker ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
安裝CE版本的docker
[root@Docker ~]# yum -y install docker-ce
啓動docker,
添加開機啓動,
查看docker版本
[root@Wangwenli ~]# systemctl start docker
[root@Wangwenli ~]# systemctl enable docker
[root@Wangwenli ~]# docker version
在開始學習docker以前,咱們首先要更改一下docker的默認源鏡像下載地址(默認是從國外下載,很慢),咱們須要添加國內的源地址
[root@Wangwenli ~]# cat /etc/docker/daemon.json
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
[root@Wangwenli ~]# systemctl daemon-reload
[root@Wangwenli ~]# systemctl restart docker
3.1 Docker命令:search(用於從docker的官方公有鏡像倉庫查找鏡像)
[root@Wangwenli ~]# docker search centos
特別說明:
Name:鏡像的名字
DESCRIPTION:描述
STARS:星級(越高越好)
OFFICIAL:是不是官方發佈的
AUTOMATED:是否自動化的
(2)查找星級多於100的centos鏡像
[root@Wangwenli ~]# docker search centos -f stars=100
特別提示:
/:符號用於分割做者名稱和鏡像名稱
ansible/centos7-ansible:ansible是做者名稱,centos7-ansible是鏡像名稱
(3)多條件查找--filter
查找官方發佈的,星級大於100的centos鏡像
[root@Wangwenli ~]# docker search centos --filter is-official=true --filter stars=100
查找符合條件的hello-world鏡像
[root@Wangwenli ~]# docker search hello-world --filter is-official=true --filter stars=100
下載目標hello-world鏡像
[root@Wangwenli ~]# docker pull hello-world
下載目標centos:7鏡像(
網速很差的話,須要點時間耐心等待
)
[root@Wangwenli ~]# docker pull centos:7
用於本地鏡像的查看
特別說明:
REPOSITORY:鏡像倉庫(下邊羅列的都是本地已有鏡像名稱)
TAG:鏡像的標記(爲了區分同名鏡像)
IMAGES ID:鏡像的ID號
CREATED:此鏡像的建立時間
SIZE:此鏡像的大小
用於本地自定義鏡像的構建,須要建立Dockerfile文件
建立Dockerfile文件的存儲目錄
[root@Docker ~]# mkdir -p /root/dockerfile/lib/centos/7
[root@Docker ~]# cd /root/dockerfile/lib/centos/7
建立docker.sh腳本
[root@Docker 7]# vim docker.sh
[root@Docker 7]# cat docker.sh
#!/bin/bash
while true
do
echo "nihao"
sleep 5
done
建立Dockerfile配置文件,文件名稱必須爲Dockerfile,第一個字母必須大寫
[root@Docker 7]# vim Dockerfile
[root@Docker 7]# cat Dockerfile
FROM centos #從centos源鏡像的基礎上進行構建
LABEL MAINTATNER="wwl" #做者的名稱
RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #RUN:在鏡像構建過程當中運行命令
ADD docker.sh /home/test/ #從本地系統中把docker.sh文件添加到構建中的鏡像的/home/test/目錄下
RUN chmod +x /home/test/docker.sh #在鏡像構建過程當中運行命令
CMD ["/home/test/docker.sh"] #構建鏡像完成時,最後執行的命令
根據Dockfile配置文件構建一個自定義鏡像
[root@Docker 7]# docker build -t wwl/centos7:1 . #-t 指定鏡像名稱 :1 設定鏡像的tag標記
運行一個本地鏡像
[root@Docker 7]# docker run -dit 930caa8ceeb6 /bin/bash
1af173b11dbb11131a823f9ef64979cf2db906bb2d442d00447cc8161971cc66
特別提示:
docker run:運行一個指定的images id
-d:放在後臺運行
-i:能夠進行命令交互
-t:製做一個僞終端用於登錄
鏡像的ID,能夠簡寫成930
查看已經運行的鏡像的進程
[root@Docker 7]# docker ps -a #查看全部運行的鏡像進程(包含退出的exit)
特別提示:
STATUS:進程的狀態,UP表示正在運行中,EXIT表示已經退出了。
從本地系統中切入到某個STATUS狀態是UP的鏡像進程裏
[root@Docker 7]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES1af173b11dbb 930caa8ceeb6 "/bin/bash" 4 minutes ago Up 4 minutes
upbeat_napier[root@Docker 7]# docker attach 1af173b11dbb #切入到容器號爲1af173b11dbb的鏡像進程裏
[root@1af173b11dbb /]# ls #已經進入容器裏了
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@1af173b11dbb /]# exit #退出容器
exit
[root@Docker 7]# docker ps -a #容器的進程的STATUS已經處於EXIT狀態(以前是後臺運行的,切入進去後執行exit就等於手動退出了)
用於中止一個正在運行着的容器進程
再次在後臺啓動一個鏡像
增長了一個容器進程
中止一個運行着的容器進程
用於啓動一個已經中止了的容器進程
用於刪除一個已經中止了的容器進程
用於刪除一個未用做容器啓動的本地鏡像
[root@Docker 7]# docker rmi 930
Error response from daemon: conflict: unable to delete 930caa8ceeb6 (cannot be forced) - image is being used by running container 8576060bb73d #但要注意,被用做容器啓動的鏡像是不能刪除的(需先rm刪除容器進程)
[root@Docker 7]# docker rmi -f 930
Error response from daemon: conflict: unable to delete 930caa8ceeb6 (cannot be forced) - image is being used by running container 8576060bb73d #強行刪除被容器進程佔用的鏡像也是不行的
查看容器進程,被佔用中
將一個更改過的容器進程的容器狀態保存爲一個新的鏡像
查看啓動的容器進程
切入容器進程,
在容器進程裏建立yunjisuan目錄,
退出容器進程
將更改後的容器進程保存爲一個新的鏡像
[root@Docker 7]# docker commit 857 wwl/centos:2
sha256:e11d502b90bc022ae5d8ed6b068e25e45f50a89edf6d9dfaf6caa7ede44c4acb
啓動新保存的鏡像
[root@Docker 7]# docker run -dit e11 /bin/bash
0ffd2ef0e3bdaa36f02cc4f59ea0e19c2355878dbe820e9053e7d4a8aafda7bd
查看新鏡像的容器進程
切入新鏡像的容器進程,
咱們發現以前建立的目錄仍舊存在
用於從本地操做系統上直接向容器進程發佈執行命令並返回結果
[root@Docker ~]# docker exec 0ff ls /tmp #查看容器進程裏的/tmp目錄下全部內容
ks-script-h2MyUP
yum.log
[root@Docker ~]# docker exec 0ff ls -d yunjisuan #查看容器進程裏/yunjisuan目錄
yunjisuan
用於在容器進程和本地系統之間複製文件
[root@Docker ~]# docker exec 0ff ls /tmp #向容器進程發佈命令
ks-script-h2MyUP
yum.log
[root@Docker ~]# docker cp 0ff:/tmp/yum.log . #將指定容器進程的/tmp/yum.log複製到當
前目錄下
[root@Docker ~]# ls
anaconda-ks.cfg dockerfile yum.log #已經複製過來了
[root@Docker ~]# docker cp anaconda-ks.cfg 0ff:/tmp/ #將本地文件複製到容器進程裏
[root@Docker ~]# docker exec 0ff ls /tmp
anaconda-ks.cfg #複製成功
ks-script-h2MyUP
yum.log
用於建立一個容器進程,可是並不啓動它
查看容器進程與源鏡像作對比,發生了改變的文件或文件夾
啓動一個鏡像的容器進程
[root@Docker ~]# docker run -dit e11
d1e90a6a0013e735c4fca03f1325e9a966fd356bec8d33bc534c1c73e7d90b30
切入容器進程
,在容器進程中建立文件
,退出容器進程
查看容器進程的變化
時時監測容器的變化狀況
前臺時時監控容器的變化若要檢測,須要另外再起一個窗口進行操做
將容器進程的文件系統導出到本地
將容器進程導出成一個tar包
用於將export導出的文件系統建立爲一個鏡像
用於查看一個鏡像的歷史修改紀錄
用於查看當前操做系統的docker運行信息
[root@Docker ~]# docker info
Containers: 1 #容器進程1個
Running: 1 #正在運行狀態的容器1個
Paused: 0
Stopped: 0
Images: 8 #一共有8個鏡像
Server Version: 18.09.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 96ec2177ae841256168fcf76954f7177af9446eb
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 974.6MiB
Name: Docker
ID: 5YNS:BXNE:O23E:DZWE:ST6K:OEXH:LBAB:DCAD:5W3D:RUJU:FQ64:3O5O
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://registry.docker-cn.com/
Live Restore Enabled: false
Product License: Community Engine
查看某個鏡像的詳細信息
[root@Docker ~]# docker inspect ea32ac5ede08
[
{
"Id": "sha256:ea32ac5ede089e65676f3e00b7580be456234206999e75c767debd0071c7d7a7",
"RepoTags": [
"wwl/centos:3"
],
"RepoDigests": [],
"Parent": "",
"Comment": "Imported from -",
"Created": "2019-01-14T07:43:56.554044061Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"DockerVersion": "18.09.1",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 201779577,
"VirtualSize": 201779577,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/3da3b10942aa4ef821dbe590d8c1b968ca72c06430618ffd317f
a0920ca860bd/merged", "UpperDir": "/var/lib/docker/overlay2/3da3b10942aa4ef821dbe590d8c1b968ca72c06430618ffd317fa
0920ca860bd/diff", "WorkDir": "/var/lib/docker/overlay2/3da3b10942aa4ef821dbe590d8c1b968ca72c06430618ffd317fa0
920ca860bd/work" },
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:f92b22b571a9faebf9f5e013f8f7d84c0181c0610fdb8b20fc2da22f43b0b56d"
]
},
"Metadata": {
"LastTagTime": "2019-01-14T15:43:56.603952511+08:00"
}
}
]
強行中止一個或多個正在運行狀態的容器進程
用於將一個鏡像的文件系統導出到本地(export導出的是容器)
從新build一個鏡像
save導出test:1這個鏡像(也能夠用id號)
用於將save導出到本地的tar包,從新加載爲鏡像(和源鏡像的名字標識徹底同樣)
刪除別的鏡像,就保留兩個
將以前test:1這個鏡像的save備份導入系統
用於輸出一個容器進程內的操做日誌
只顯示容器日誌的後5行
用於將一個或多個容器的進程暫停和恢復
用於列出一個容器的端口映射及協議
[root@Docker 7]# docker run -dit -p 6666:22 test:1 #啓動一個鏡像的容器進程 -p 指定本地6666端口映射到容器的22端口
d7641bcd7949432b0eaa084bd7600cf2631add788ecb2ec6f124ffa2532a5bd0
[root@Docker 7]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PO
RTS NAMESd7641bcd7949 test:1 "/home/test/docker.sh" 5 seconds ago Up 3 seconds 0.
0.0.0:6666->22/tcp romantic_gates2d5d764e0e22 test:1 "/home/test/docker.sh" 4 minutes ago Up 4 minutes
silly_jackson
查看容器進程的端口映射及協議
[root@Docker 7]# docker port d7641bcd7949
22/tcp -> 0.0.0.0:6666
[root@Docker 7]# docker pull nginx
[root@Docker 7]# docker run -dit --name nginx_test -p 80:80 7042885a156a 啓動本地鏡像nginx,進程名叫nginx_test,將本地的80端口映射到容器的80端口
nginx關閉了守護模式,就至關於nginx在前臺啓動了,日常啓動nginx是在後臺啓動,可是放後臺啓動容器啓動不了,因此在啓動時關閉了nginx的守護模式
本地沒有安裝nginx,看的就是容器裏的nginx,就是訪問宿主機的80端口,映射到了容器裏的80端口
給容器進程重命名
重啓一個容器進程
用於時時輸出容器的資源使用狀況
--no-tream只輸出一次
用於從一個指定的鏡像建立另一個鏡像
用於顯示指定容器的進程信息
用於調整一個或多個容器的啓動配置
version用於顯示docker的版本信息
wait用於捕捉一個或多個容器的退出狀態,並返回退出狀態碼
顯示docker版本信息
監聽容器的退出狀態並返回狀態碼
[root@Docker 7]# docker wait wwl
須要在開一個窗口stop這個容器進程再查看
- login用於登錄docker hub官方公有倉庫
- logout用於登出docker hub官方公有倉庫
- push用於將本地鏡像提交到docker hub
因爲docker hub國內已經沒法註冊,所以沒法演示上述內容
DockerHub官方公有鏡像倉庫:https://hub.docker.com/
將Docker主機數據掛載到容器
建立一個卷
下載一個nginx官方鏡像(前面已經下載過)
[root@Docker 7]# docker run -dit --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/
html nginx
特別說明:
--name:容器的名字
--mount:掛載
src:源卷的名字
dst:掛載到容器中的路徑
向容器中的掛載目錄建立文件,查看是否掛載成功
[root@Docker 7]# docker exec nginx-test touch /usr/share/nginx/html/test.txt
[root@Docker 7]# docker exec nginx-test ls /usr/share/nginx/html/
50x.html
index.html
test.txt #有了
[root@Docker 7]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html test.txt #成功
清理容器進程
清理容器後,掛載的卷的數據仍舊存在
從新啓動鏡像nginx的容器進程
特別提示:
docker run的-p參數:指定端口的映射,88:80的意思就是將宿主機88端口的訪問映射到容器進程的80端口
如今咱們經過瀏覽器訪問宿主機的88端口,進而訪問容器進程的80端口
在數據卷nginx-vol裏換一個網頁在訪問
如今咱們再啓動一個鏡像nginx的進程,讓兩個nginx的容器進程公用一個數據卷nginx-vol
[root@Docker 7]# docker run -dit --name nginx-test2 -p 89:80 --mount src=nginx-vol,dst=/usr/sh
are/nginx/html nginx
咱們用瀏覽器訪問docker宿主機的89端口
4.1.2 Bind Mounts
[root@Docker 7]# docker run -dit --name nginx-test3 -p 90:80 --mount type=bind,src=/var/lib/do
cker/volumes/nginx-vol/_data,dst=/usr/share/nginx/html nginx
咱們用瀏覽器訪問docker宿主機的90端口
特別提示:
bind mounts能夠掛載宿主機上的任意目錄,而volume先得建立後才能掛載
用卷管理,卷建立好是空的,而後掛載到鏡像裏,鏡像裏的源目錄是有東西的,它會自動出如今卷裏,可是bind mounts會把鏡像裏的東西給頂了,以這種方式掛過去,默認是以本身目錄爲主,若是用卷,是以對方目錄爲主
首先咱們下載一個wordpress博客
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
下載MySQL5.6版本鏡像:[root@Docker ~]# docker pull mysql:5.6
[root@Docker ~]# docker network create lnmp #建立一個自定義網絡
啓動MySQL數據庫容器
[root@Docker ~]# docker run -dit --name lnmp_mysql --network lnmp -p 3306:3306 --mount src=mys
ql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6 --character-set-server=utf8
索引的長度不能超過254=254x3字節(一個漢字三字節),索引太長容易影響sql的效率
特別提示:
- 自定義網絡lnmp若是不提早建立的話,在啓動容器進程時會報錯
- 若是沒有提早pull好mysql:5.6那麼容器在啓動時會自動下載對應鏡像
- 若是沒有提早docker volume create mysql-vol,那麼容器啓動時會自動建立
4.2.2 向容器裏的Mysql建立一個庫
[root@Docker ~]# docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
4.2.3 查看添加的庫
nginx和PHP都須要訪問網頁目錄,而且nginx和php的網頁路徑必須同樣,nginx和tomcat配合就不是,tomcat本身能夠獨立訪問動靜態,只是tomcat處理靜態不好,太慢,前面才加了nginx,而後nginx推給8080端口就到了tomcat
建立一個網頁目錄
下載richarvey/nginx-php-fpm鏡像
[root@Docker ~]# docker pull richarvey/nginx-php-fpm
啓動richarvey/nginx-php-fpm鏡像的容器
[root@Docker ~]# docker run -dit --name lnmp_web --network lnmp -p 88:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
若是還訪問不了,那麼執行下面的,重啓docker
經過瀏覽器進行docker宿主機的88端口的訪問測試
http://IP:88/訪問成功後再去訪問
特別提示: 若是屢次連續訪問同一網頁,那麼瀏覽器有可能默認去掉指定的端口 所以,若訪問不到,請查看是否指定了88端口