在Docker – 系統(tǒng)整潔之道 – 1中已經(jīng)對Docker的一些命令和Docker鏡像的使用及操作做了記錄。 這次就利用docker進(jìn)行一次真正的實(shí)例使用,使用docker搭建一個(gè)簡單的答題系統(tǒng),這個(gè)系統(tǒng)是當(dāng)時(shí)做來給網(wǎng)絡(luò)安全周做手機(jī)答題的系統(tǒng),很簡單,代碼風(fēng)格很差。
這篇主要記錄了三種docker使用的方式。
用supervisor方式運(yùn)行一個(gè)多進(jìn)程的docker實(shí)例創(chuàng)建一個(gè)ngnix和php運(yùn)行的環(huán)境創(chuàng)建一個(gè)ngnix,php,MySQL集合運(yùn)行的環(huán)境,使用docker-compose構(gòu)建感覺docker的東西越看越多,從剛開始的簡簡單單的一個(gè)docker run,到現(xiàn)在看到要build自己的鏡像,compose,也就是以前的Fig,配置網(wǎng)絡(luò),還有swarm的docker集群,一點(diǎn)一點(diǎn)來吧。
先把兩個(gè)附件寫在這里吧 此片博客中構(gòu)建php+ngnix+mysql測試環(huán)境的腳本 在測試環(huán)境中的答題網(wǎng)站源碼
Docker 容器在啟動的時(shí)候開啟單個(gè)進(jìn)程,比如,一個(gè) ssh 或者 apache 的 daemon 服務(wù)。但我們經(jīng)常需要在一個(gè)機(jī)器上開啟多個(gè)服務(wù),這可以有很多方法,最簡單的就是把多個(gè)啟動命令放到一個(gè)啟動腳本里面,啟動的時(shí)候直接啟動這個(gè)腳本,另外就是安裝進(jìn)程管理工具。這里使用進(jìn)程管理工具 supervisor 來管理容器中的多個(gè)進(jìn)程。使用 Supervisor 可以更好的控制、管理、重啟我們希望運(yùn)行的進(jìn)程。
首先創(chuàng)一個(gè)文件夾叫做supervisor
,目錄結(jié)構(gòu)為
其中文件Dockerfile文件內(nèi)容為:
#使用時(shí)哪個(gè)鏡像FROM Ubuntu:13.04MAINTAINER [email protected] echo "deb http://archive.ubuntu.com/ubuntu PRecise main universe" > /etc/apt/sources.listRUN apt-get updateRUN apt-get upgrade -y#這里安裝 3 個(gè)軟件,還創(chuàng)建了 2 個(gè) ssh 和 supervisor 服務(wù)正常運(yùn)行所需要的目錄。RUN apt-get install -y --force-yes perl-base=5.14.2-6ubuntu2RUN apt-get install -y apache2.2-commonRUN apt-get install -y openssh-server apache2 supervisorRUN mkdir -p /var/run/sshdRUN mkdir -p /var/log/supervisor#添加 supervisord 的配置文件,并復(fù)制配置文件到對應(yīng)目錄下面。COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf#映射了 22 和 80 端口,使用 supervisord 的可執(zhí)行路徑啟動服務(wù)EXPOSE 22 80CMD ["/usr/bin/supervisord"]文件supervisord
內(nèi)容為:
使用命令進(jìn)行構(gòu)建
sudo docker build -t supervisor輸出:
~/Docker/supervisor sudo docker build -t supervisord .PassWord:Sending build context to Docker daemon 3.584 kBStep 1 : FROM ubuntu:13.04---> a58cd502f927Step 2 : MAINTAINER [email protected]> Using cache---> 15f104cdeb77Step 3 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list---> Using cache---> c6bb44d794eaStep 4 : RUN apt-get update---> Using cache---> adcd83eecb0dStep 5 : RUN apt-get upgrade -y---> Using cache---> 89e045811261Step 6 : RUN apt-get install -y --force-yes perl-base=5.14.2-6ubuntu2---> Using cache---> bcdc472cc73aStep 7 : RUN apt-get install -y apache2.2-common---> Using cache---> d8991f8aa3c6Step 8 : RUN apt-get install -y openssh-server apache2 supervisor---> Using cache---> a713034800d6Step 9 : RUN mkdir -p /var/run/sshd---> Using cache---> 3138e3644958Step 10 : RUN mkdir -p /var/log/supervisor---> Using cache---> 958c08978b0cStep 11 : COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf---> 8e9a0c97a133Removing intermediate container d95b58057f73Step 12 : EXPOSE 22 80---> Running in 9cabb0865159---> b4aa8b82cd57Removing intermediate container 9cabb0865159Step 13 : CMD /usr/bin/supervisord---> Running in 237f71166211---> 569f95736129Removing intermediate container 237f71166211Successfully built 569f95736129使用docker ps
一下
發(fā)現(xiàn)剛才build的鏡像已經(jīng)跑起來了,訪問 http://127.0.0.1:32769,可以web服務(wù)已經(jīng)跑起來了。
使用命令docker exec
進(jìn)入container里面看看
使用passwd修改一下密碼,然后在本機(jī)的命令行里進(jìn)行ssh連接吧。
該方法就是直接使用docker命令進(jìn)行構(gòu)建一個(gè)ngnix,php結(jié)合運(yùn)行的環(huán)境,沒有使用docker-compose。
先用戶根目錄~
下創(chuàng)建目錄,并將該目錄設(shè)置為Docker的共享目錄。
其中default.conf
文件內(nèi)容,這是個(gè)nginx的配置文件
index.html 里寫一句 HelloW0rld,phpinfo.php里面寫一個(gè)<?php phpinfo();?>
。
然后在命令行下執(zhí)行命令
docker pull php:5.6-fpm-alpinedocker pull ngnix:1.10.2docker run --name dream.php -d -v ~/Workspace/tmp/www:/var/www/html:ro php:5.6-fpmdocker run --name dream.nginx -p 80:80 -d -v ~/Workspace/tmp/www:/usr/share/nginx/html:ro -v ~/Workspace/tmp/docker/nginx/conf.d:/etc/nginx/conf.d:ro --link dream.php:php nginx:1.10.2好的,如果不出意外,就可以看到phpinfo的界面了。這個(gè)是沒有添加mysql的測試環(huán)境,直接在目錄~/Workspace/tmp/www
下面放網(wǎng)頁就可以直接使用了。
Supervisor給出了一種能夠在container中運(yùn)行多個(gè)線程的方法,但是現(xiàn)在還是不知道要怎么樣把自己的web服務(wù)部署到container中,數(shù)據(jù)庫怎么建,可以有人會說直接使用SFTP將網(wǎng)站直接傳到container里,安裝數(shù)據(jù)庫,配環(huán)境,但是docker中一旦container被刪除,內(nèi)容就沒了。像這樣將所有服務(wù)放在一個(gè)容器內(nèi)的模式有個(gè)形象的非官方稱呼:Fat Container。與之相對的是將服務(wù)分拆到容器的模式。從Docker的設(shè)計(jì)可以看到,構(gòu)建鏡像的過程中可以指定唯一一個(gè)容器啟動的指令,因此Docker天然適合一個(gè)容器只運(yùn)行一種服務(wù),而這也是官方更推崇的。下面就記錄一下部署一個(gè)簡單的php程序和數(shù)據(jù)庫聯(lián)動的測試環(huán)境。
整體的文件結(jié)構(gòu)是這樣的 我們創(chuàng)建一個(gè)這樣的目錄
Docker└── test ├── data 數(shù)據(jù)庫文件夾 │ └── mysql ├── docker-compose.yml docker-compose配置文件 ├── htdocs 網(wǎng)站文件夾 │ ├── index.html │ └── index.php ├── log 日志文件 │ └── nginx ├── mysql mysql構(gòu)建文件 │ └── Dockerfile ├── nginx nginx構(gòu)建文件 │ ├── Dockerfile │ ├── conf.d │ │ └── default.conf │ └── nginx.conf └── php php構(gòu)建文件 └── Dockerfilemysql目錄下的Dockerfile文件只有一行FROM mysql:5.6
,也就是直接使用mysql官方鏡像5.6,然后使用命令
構(gòu)建自己的鏡像phpenv/mysql。 使用命令
docker run -p 3306:3306 -v ~/Docker/test/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it phpenv/mysql啟動鏡像,將容器的3306端口綁定到本機(jī)的3306端口,其中參數(shù)-v
后代表使用~/Docker/test/data/mysql
掛在到鏡像的/var/lib/mysql
,也就是替代源鏡像的數(shù)據(jù)庫文件目錄,讓數(shù)據(jù)庫文件目錄暴露在本機(jī)上,做到數(shù)據(jù)庫內(nèi)容的持久化。MYSQL_ROOT_PASSWORD
為設(shè)置mysql的一個(gè)root密碼。
運(yùn)行結(jié)果
~/Docker/test docker run -p 3306:3306 -v ~/Docker/test/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it phpenv/mysql2016-12-27 15:06:49 0 [Note] mysqld (mysqld 5.6.35) starting as process 1 ...2016-12-27 15:06:49 1 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive2016-12-27 15:06:49 1 [Note] Plugin 'FEDERATED' is disabled.2016-12-27 15:06:49 1 [Note] InnoDB: Using atomics to ref count buffer pool pages2016-12-27 15:06:49 1 [Note] InnoDB: The InnoDB memory heap is disabled2016-12-27 15:06:49 1 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins2016-12-27 15:06:49 1 [Note] InnoDB: Memory barrier is not used2016-12-27 15:06:49 1 [Note] InnoDB: Compressed tables use zlib 1.2.82016-12-27 15:06:49 1 [Note] InnoDB: Using Linux native AIO2016-12-27 15:06:49 1 [Note] InnoDB: Using CPU crc32 instructions2016-12-27 15:06:49 1 [Note] InnoDB: Initializing buffer pool, size = 128.0M2016-12-27 15:06:49 1 [Note] InnoDB: Completed initialization of buffer pool2016-12-27 15:06:49 1 [Note] InnoDB: Highest supported file format is Barracuda.2016-12-27 15:06:49 1 [Note] InnoDB: 128 rollback segment(s) are active.2016-12-27 15:06:49 1 [Note] InnoDB: Waiting for purge to start2016-12-27 15:06:49 1 [Note] InnoDB: 5.6.35 started; log sequence number 16260272016-12-27 15:06:49 1 [Note] Server hostname (bind-address): '*'; port: 33062016-12-27 15:06:49 1 [Note] IPv6 is available.2016-12-27 15:06:49 1 [Note] - '::' resolves to '::';2016-12-27 15:06:49 1 [Note] Server socket created on IP: '::'.2016-12-27 15:06:49 1 [Warning] 'proxies_priv' entry '@ root@bd69eb248839' ignored in --skip-name-resolve mode.2016-12-27 15:06:49 1 [Note] Event Scheduler: Loaded 0 events2016-12-27 15:06:49 1 [Note] mysqld: ready for connections.Version: '5.6.35' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)使用DBeaver連接后
查看一下當(dāng)前~/Docker/test/data/mysql
數(shù)據(jù)庫目錄下的文件
新建一個(gè)庫docker_test后~/Docker/test/data/mysql
數(shù)據(jù)庫目錄下的文件
可以發(fā)現(xiàn)數(shù)據(jù)庫已經(jīng)創(chuàng)建好了,也如下圖
為了驗(yàn)證數(shù)據(jù)庫數(shù)據(jù)的持久型,我們先停止當(dāng)前運(yùn)行的container并產(chǎn)出它,然后從鏡像啟動一個(gè)新的container,如命令
~/Docker ? docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES970dec0f7de9 phpenv/mysql "docker-entrypoint.sh" 30 minutes ago Up 30 minutes 0.0.0.0:3306->3306/tcp berserk_brown~/Docker ? docker stop 970dec0f7de9970dec0f7de9~/Docker ? docker rm 970dec0f7de9970dec0f7de9~/Docker ? docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc82c830770bc supervisord:latest "/usr/bin/supervisord" 35 hours ago Exited (0) 32 minutes ago supervisord~/Docker ? docker run -p 3306:3306 -v ~/Docker/test/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it phpenv/mysql2016-12-27 15:38:04 0 [Note] mysqld (mysqld 5.6.35) starting as process 1 ...2016-12-27 15:38:04 1 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive2016-12-27 15:38:04 1 [Note] Plugin 'FEDERATED' is disabled.2016-12-27 15:38:04 1 [Note] InnoDB: Using atomics to ref count buffer pool pages2016-12-27 15:38:04 1 [Note] InnoDB: The InnoDB memory heap is disabled2016-12-27 15:38:04 1 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins2016-12-27 15:38:04 1 [Note] InnoDB: Memory barrier is not used2016-12-27 15:38:04 1 [Note] InnoDB: Compressed tables use zlib 1.2.82016-12-27 15:38:04 1 [Note] InnoDB: Using Linux native AIO2016-12-27 15:38:04 1 [Note] InnoDB: Using CPU crc32 instructions2016-12-27 15:38:04 1 [Note] InnoDB: Initializing buffer pool, size = 128.0M2016-12-27 15:38:04 1 [Note] InnoDB: Completed initialization of buffer pool2016-12-27 15:38:04 1 [Note] InnoDB: Highest supported file format is Barracuda.2016-12-27 15:38:04 1 [Note] InnoDB: 128 rollback segment(s) are active.2016-12-27 15:38:04 1 [Note] InnoDB: Waiting for purge to start2016-12-27 15:38:04 1 [Note] InnoDB: 5.6.35 started; log sequence number 16260372016-12-27 15:38:04 1 [Note] Server hostname (bind-address): '*'; port: 33062016-12-27 15:38:04 1 [Note] IPv6 is available.2016-12-27 15:38:04 1 [Note] - '::' resolves to '::';2016-12-27 15:38:04 1 [Note] Server socket created on IP: '::'.2016-12-27 15:38:04 1 [Warning] 'proxies_priv' entry '@ root@bd69eb248839' ignored in --skip-name-resolve mode.2016-12-27 15:38:04 1 [Note] Event Scheduler: Loaded 0 events2016-12-27 15:38:04 1 [Note] mysqld: ready for connections.Version: '5.6.35' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)再次連接數(shù)據(jù)庫驗(yàn)證,發(fā)現(xiàn)剛才新建的庫docker_test
還在,數(shù)據(jù)庫文件持久型保存了。
待完善
nginx在構(gòu)建的時(shí)候要替換兩個(gè)配置文件,Dockfile
FROM nginx:1.10.2ADD nginx.conf /etc/nginx/nginx.confADD conf.d/* /etc/nginx/conf.d/掛載文件在docker-compose里進(jìn)行定義。
待完善
php什么也不做,只通過Dockfile
FROM php:5.6-fpm來構(gòu)建
待完善
docker-compose文件
nginx: build: ./nginx ports: - "40080:80" links: - "php" volumes: - ~/Docker/test/htdocs:/usr/share/nginx/htmlphp: build: ./php ports: - "49000:9000" links: - "mysql" volumes: - ~/Docker/test/htdocs:/var/www/htmlmysql: build: ./mysql ports: - "43306:3306" volumes: - ~/Docker/test/data/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 123456記錄一下,首先docker-compse是用來集合構(gòu)建多個(gè)鏡像的工具,這里我們集合了nginx,php,mysql來搭建一個(gè)php的測試環(huán)境,在文件中,有一個(gè)links參數(shù),是用來連接其他實(shí)例,讓多個(gè)實(shí)例之間可以進(jìn)行通信。
這里有整合文件的下載鏈接,下載后,將文件放在用戶根目錄下,命令行執(zhí)行docker-compose up
,結(jié)果
訪問一下 http://localhost:40080/index.php ,正常的話,如下圖
下面的代碼是今年網(wǎng)絡(luò)安全周的一個(gè)手機(jī)在線答題系統(tǒng),代碼很挫,大牛誤笑
源碼在這里。
將目錄直接放在~/Docker/test/htdocs
下面,然后在test目錄下執(zhí)行docker-compose up
,正常情況下,就會跑起來上面的容器,然后按照代碼的README將數(shù)據(jù)庫部署就可以運(yùn)行了。
原文鏈接: http://dengnanyi.com/2016/12/24/2016_12/docker-learn-3/
新聞熱點(diǎn)
疑難解答
圖片精選