今次我要試的是 DOCKER , 點解要試這個 ? 因為有公司舊的網頁要用 PHP 5.x 同時又要 PHP 7.x 雖然好多方法去實現同時運行多個 PHP VERSION , 但是一個好機會試吓新東西
在文章最後有我參考過的網站文章連結
大家先去了解什麼是 DOCKER
參考網址 : https://philipzheng.gitbooks.io/docker_practice/content/
好了大家了解都差不多了 , 那我們開始吧 !
我用的是 ubuntu , 所以以下 command 都是 debian apt
apt update apt upgrade apt install gnupg2 apt install curl apt install software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(cat /etc/os-release | grep UBUNTU_CODENAME | cut -d ‘=’ -f 2) stable” apt update apt install docker-ce |
好了安裝完, 立即試一試, hello-world docker 有什麼反應先
root@docker-test:~# docker run hello-world Unable to find image ‘hello-world:latest’ locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752 Status: Downloaded newer image for hello-world:latest Hello from Docker! To generate this message, Docker took the following steps: To try something more ambitious, you can run an Ubuntu container with: Share images, automate workflows, and more with a free Docker ID: For more examples and ideas, visit: root@docker-test:~# |
當你行 docker run hello-world
它會自動上到 “倉庫” 找 “hello-world” 這個影像檔然後執行
之後我們再試下 ubuntu shell 看看
docker run -it ubuntu bash
root@docker-test:~# docker run -it ubuntu bash Unable to find image ‘ubuntu:latest’ locally latest: Pulling from library/ubuntu 423ae2b273f4: Pull complete de83a2304fa1: Pull complete f9a83bce3af0: Pull complete b6b53be908de: Pull complete Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df Status: Downloaded newer image for ubuntu:latest root@7b55e3f631cd:/# |
這個 shell 是在 ubuntu image 內執行的 , “7b55e3f631cd” 就是 docker 生成的 ubuntu 容器內裏就是一個 ubuntu
root@7b55e3f631cd:/# ls -la total 72 drwxr-xr-x 1 root root 4096 Feb 24 07:43 . drwxr-xr-x 1 root root 4096 Feb 24 07:43 .. -rwxr-xr-x 1 root root 0 Feb 24 07:43 .dockerenv drwxr-xr-x 2 root root 4096 Feb 19 01:17 bin drwxr-xr-x 2 root root 4096 Apr 24 2018 boot drwxr-xr-x 5 root root 360 Feb 24 07:43 dev drwxr-xr-x 1 root root 4096 Feb 24 07:43 etc drwxr-xr-x 2 root root 4096 Apr 24 2018 home drwxr-xr-x 8 root root 4096 May 23 2017 lib drwxr-xr-x 2 root root 4096 Feb 19 01:15 lib64 drwxr-xr-x 2 root root 4096 Feb 19 01:14 media drwxr-xr-x 2 root root 4096 Feb 19 01:14 mnt drwxr-xr-x 2 root root 4096 Feb 19 01:14 opt dr-xr-xr-x 392 nobody nogroup 0 Feb 24 07:43 proc drwx—— 2 root root 4096 Feb 19 01:17 root drwxr-xr-x 1 root root 4096 Feb 21 22:20 run drwxr-xr-x 1 root root 4096 Feb 21 22:20 sbin drwxr-xr-x 2 root root 4096 Feb 19 01:14 srv dr-xr-xr-x 13 nobody nogroup 0 Feb 20 03:34 sys drwxrwxrwt 2 root root 4096 Feb 19 01:17 tmp drwxr-xr-x 1 root root 4096 Feb 19 01:14 usr drwxr-xr-x 1 root root 4096 Feb 19 01:17 var root@7b55e3f631cd:/# |
其實概念就 docker 生成一個可讀寫的容器 , 把 image 投射內其中, 你在這個容器做的東西不會影響 image 內的資料 ,
image 是唯讀的 !
每個 docker 生成的容器都是獨立 , 容器究竟是什麼 , 如果你知道有些掃毒程式會創造 “沙盒” 來測試那些行檔是否中毒 !
沙盒的概述可以看看這些網址
https://www.arthurtoday.com/2011/06/sandbox.html
http://www.pcdiy.com.tw/detail/11605
同樣 docker 生成的容器就算被入侵 , 基本上都不會影響主機 !
我們試一試裝個 apche , 先看看有那些 image 可以用先
用command “docker search apache” 找找有什麼 image 可用
root@docker-test:~# docker search apache NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 2869 [OK] tomcat Apache Tomcat is an open source implementati… 2645 [OK] cassandra Apache Cassandra is an open-source distribut… 1092 [OK] maven Apache Maven is a software project managemen… 983 [OK] solr Solr is the popular, blazing-fast, open sour… 729 [OK] apache/nifi Unofficial convenience binaries and Docker i… 161 [OK] eboraas/apache-php PHP on Apache (with SSL/TLS support), built … 143 [OK] apache/zeppelin Apache Zeppelin 117 [OK] eboraas/apache Apache (with SSL/TLS support), built on Debi… 91 [OK] apache/airflow Apache Airflow 87 groovy Apache Groovy is a multi-faceted language fo… 85 [OK] nimmis/apache-php5 This is docker images of Ubuntu 14.04 LTS wi… 61 [OK] apacheignite/ignite Apache Ignite In-Memory docker image. 60 [OK] bitnami/apache Bitnami Apache Docker Image 58 [OK] linuxserver/apache An Apache container, brought to you by Linux… 25 apachepulsar/pulsar Apache Pulsar – Distributed pub/sub messagin… 22 apache/nutch Apache Nutch 21 [OK] antage/apache2-php5 Docker image for running Apache 2.x with PHP… 16 [OK] webdevops/apache Apache container 14 [OK] newdeveloper/apache-php apache-php7.2 5 lephare/apache Apache container 5 [OK] newdeveloper/apache-php-composer apache-php-composer 4 secoresearch/apache-varnish Apache+PHP+Varnish5.0 2 [OK] oberonamsterdam/apache24-fpm Default Oberon apache setup using PHP-FPM, r… 1 [OK] jelastic/apachephp An image of the Apache PHP application serve… 0 root@docker-test:~# |
有數十個 image 可用 , 有些包含 tomcat , 有些包含 php , 看看你想用那一個 !
我們就用第一個 image “httpd” , 下載這個 image 執行 “docker pull httpd”
root@docker-test:~# docker pull httpd Using default tag: latest latest: Pulling from library/httpd bc51dd8edc1b: Pull complete dca5bc65e18f: Pull complete ccac3445152a: Pull complete 8515f2015fbc: Pull complete e35494488b8c: Pull complete Digest: sha256:b783a610e75380aa152dd855a18368ea2f3becb5129d0541e2ec8b662cbd8afb Status: Downloaded newer image for httpd:latest docker.io/library/httpd:latest root@docker-test:~# |
下載完成, 我們看看現在我們有多少個可用的 image 先 , 執行 ” docker images”
root@docker-test:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 72300a873c2c 2 days ago 64.2MB httpd latest c562eeace183 3 weeks ago 165MB hello-world latest fce289e99eb9 13 months ago 1.84kB root@docker-test:~# |
我們已經有三個 image , 先前測試用的 “hello-world” & “ubuntu” , 還有剛下載的 “httpd”
好了急不及待, 我們來創造一個 docker 環境行 apache 吧 !
root@docker-test:~# docker run -d –name=apache2 httpd 2d40f50299972e46392d10b9ecf8afbbe3189cace34aaadede7d1e372509b667 |
已經生成了一個基於 httpd image 的容器 “–name” 給予這個容器一個別名
當前有多少容器在運行 command : “dcoker ps -a”
root@docker-test:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d40f5029997 httpd “httpd-foreground” 13 minutes ago Up 13 minutes 80/tcp apache2 7b55e3f631cd ubuntu “bash” 58 minutes ago Exited (127) 52 minutes ago elastic_morse a8560ebcedb9 hello-world “/hello” About an hour ago Exited (0) About an hour ago distracted_dubinsky |
你們可以看到 status 只有 apache2 在背環繼續執行 , 因為我創造apache容器時加了 “-d” daemon
要停止那些容器 command : docker stop apache2
root@docker-test:~# docker stop apache2 apache2 root@docker-test:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d40f5029997 httpd “httpd-foreground” 20 minutes ago Exited (0) 5 seconds ago apache2 7b55e3f631cd ubuntu “bash” About an hour ago Exited (127) About an hour ago elastic_morse a8560ebcedb9 hello-world “/hello” About an hour ago Exited (0) About an hour ago distracted_dubinsky |
你看到 status 已經停止了 , 可以用 “docker start apache2” 或 “docker restart
apache2” 把容器重新運行
root@docker-test:~# docker start apache2 apache2 root@docker-test:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d40f5029997 httpd “httpd-foreground” 23 minutes ago Up 2 seconds 80/tcp apache2 7b55e3f631cd ubuntu “bash” About an hour ago Exited (127) About an hour ago elastic_morse a8560ebcedb9 hello-world “/hello” About an hour ago Exited (0) About an hour ago distracted_dubinsky |
如果要完全移除這個容器,先停止這個容器再執行 command : docker rm apache2
root@docker-test:~# docker rm apache2 Error response from daemon: You cannot remove a running container 2d40f50299972e46392d10b9ecf8afbbe3189cace34aaadede7d1e372509b667. Stop the container before attempting removal or force remove root@docker-test:~# docker stop apache2 apache2 root@docker-test:~# docker rm apache2 apache2 root@docker-test:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b55e3f631cd ubuntu “bash” About an hour ago Exited (127) About an hour ago elastic_morse a8560ebcedb9 hello-world “/hello” About an hour ago Exited (0) About an hour ago distracted_dubinsky root@docker-test:~# |
看到沒有已經移除了 apache2 這容器了 !
好了講了這麼多要點樣 config 這個容器內 apache config 呢?
我們先入去這個容器看看 ! 這個容器是個 linux 所以要linux shell 入去 !
參考網址 : https://www.runoob.com/docker/docker-exec-command.html
command : docker exec -it apache2 bash
就是在 apache2 容器行 bash shell
root@docker-test:~# docker exec -it apache2 bash root@48c49e4b63a3:/usr/local/apache2# |
已經取得 apache 容器 bash shell 了
root@48c49e4b63a3:/usr/local/apache2# ls -la total 56 drwxr-xr-x 1 www-data www-data 4096 Feb 2 00:15 . drwxr-xr-x 1 root root 4096 Feb 2 00:12 .. drwxr-xr-x 2 root root 4096 Feb 2 00:15 bin drwxr-xr-x 2 root root 4096 Feb 2 00:15 build drwxr-xr-x 2 root root 4096 Feb 2 00:15 cgi-bin drwxr-xr-x 4 root root 4096 Feb 2 00:15 conf drwxr-xr-x 3 root root 4096 Feb 2 00:15 error drwxr-xr-x 2 root root 4096 Feb 2 00:15 htdocs drwxr-xr-x 3 root root 4096 Feb 2 00:15 icons drwxr-xr-x 2 root root 4096 Feb 2 00:15 include drwxr-xr-x 1 root root 4096 Feb 24 08:55 logs drwxr-xr-x 2 root root 4096 Feb 2 00:15 modules |
這個 image 裝了 apache location 是 /usr/local/apache2 , 我們要的 apache config 就在 conf folder 內 !
直接修改這個 conf 是可以的, 但不要忘記如果容器移除了, 資料一同移除 . 那麼如何保存這些資料 ?
你可以把當前修改過的容器 , SAVE 成新的 image 使用 , 但我們今次用的是 “資料卷”
https://philipzheng.gitbooks.io/docker_practice/content/data_management/volume.html
我們現在把容器內的 apache conf folder copy 到實體機某 folder 進行修改及以資料卷的方式掛入 apache2 容器內
root@48c49e4b63a3:/usr/local/apache2/conf# ls -la total 120 drwxr-xr-x 4 root root 4096 Feb 2 00:15 . drwxr-xr-x 1 www-data www-data 4096 Feb 2 00:15 .. drwxr-xr-x 2 root root 4096 Feb 2 00:15 extra -rw-r–r– 1 root root 20823 Feb 2 00:15 httpd.conf -rw-r–r– 1 root root 13064 Feb 2 00:15 magic -rw-r–r– 1 root root 60847 Feb 2 00:15 mime.types drwxr-xr-x 3 root root 4096 Feb 2 00:15 original root@48c49e4b63a3:/usr/local/apache2/conf# exit exit root@docker-test:~# docker cp apache2:/usr/local/apache2/conf /opt/docker-apache2-conf/ root@docker-test:~# ls -l /opt/docker-apache2-conf/conf/ extra/ httpd.conf magic mime.types original/ root@docker-test:~# ls -l /opt/docker-apache2-conf/conf/ |
把apache2容器內/usr/local/apache2/conf 抄到實體機 /opt/docker-apache2-conf/
我們先把容器停了及移除重新創造一個用資料卷的apche2容器
root@docker-test:/opt/docker-apache2-conf# docker stop apache2 apache2 root@docker-test:/opt/docker-apache2-conf# docker rm apache2 apache2 root@docker-test:/opt/docker-apache2-conf# docker run -d –name=apache2 -v /opt/docker-apache2-conf/conf:/usr/local/apache2/conf -v /opt/docker-apache2-conf/html:/var/www httpd 52af877f4a8fbd927f3a8fea9e3568e3d8ee317f03f2a6e22f82cc083a8c670f |
解釋一下
-v /opt/docker-apache2-conf/conf:/usr/local/apache2/conf
-v /opt/docker-apache2-conf/html:/var/www
用 -v 就是資料卷的意思
主機 folder “/opt/docker-apache2-conf/conf” 投射入容器
“/usr/local/apache2/conf” folder
主機 folder “/opt/docker-apache2-conf/html” 投射入容器 “/var/www” folder
一切都OK 了 , 但問題來了 ? 如何把主機的 listing port 投射入容器
我們就要用 -p 8081:80
List containers
root@docker-test:/opt/docker-apache2-conf# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 52af877f4a8f httpd “httpd-foreground” 8 minutes ago Up 8 minutes 80/tcp apache2 7b55e3f631cd ubuntu “bash” 2 hours ago Exited (127) 2 hours ago elastic_morse a8560ebcedb9 hello-world “/hello” 2 hours ago Exited (0) 2 hours ago distracted_dubinsky root@docker-test:/opt/docker-apache2-conf# docker stop apache2 apache2 root@docker-test:/opt/docker-apache2-conf# docker rm apache2 apache2 root@docker-test:/opt/docker-apache2-conf# docker run -d –name=apache2 -p 8081:80 -v /opt/docker-apache2-conf/conf:/usr/local/apache2/conf -v /opt/docker-apache2-conf/html:/var/www httpd 0995c2a40a9be6643f67df8db6664ffae4fea7022261190f08d732d23715f0b7 root@docker-test:/opt/docker-apache2-conf# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0995c2a40a9b httpd “httpd-foreground” 30 seconds ago Up 27 seconds 0.0.0.0:8081->80/tcp apache2 7b55e3f631cd ubuntu “bash” 2 hours ago Exited (127) 2 hours ago elastic_morse a8560ebcedb9 hello-world “/hello” 2 hours ago Exited (0) 2 hours ago distracted_dubinsky root@docker-test:/opt/docker-apache2-conf# |
看到 status 主機 8081 port 投射到 容器的 80 port 了
那就是外部連接主機的port 8081 就會 容器apache2 提供服務 http://xx.xx.xx.xx:8081/
我參考過的網址
https://blog.basec.cc/index.php/archives/65/
https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker
https://www.jianshu.com/p/ea4a00c6c21c
https://www.iszy.cc/2019/02/13/docker-acme-sh/
https://segmentfault.com/a/1190000012063374
https://blog.chengweichen.com/2015/05/docker-nginx-php-fpm-52-mysql.html
https://my.oschina.net/u/3375733/blog/1591091
https://beginor.github.io/2017/06/08/use-compose-instead-of-run.html
https://zhuanlan.zhihu.com/p/45425683