2017/8/11

Docker基本指令與操作

在這記錄一些過程及相關指令

先去Docker Hub把別人做好的Tomcat映像檔pull下來
這裡我是直接搜尋Tomcat點第一個到這個 網址
我挑8.5.20-jre8
pull下來:
~ docker pull tomcat:8.5.20-jre8


查看目錄,確認是否有載下來:
~ docker images
成功的話會看到一個Tomcat的項目

啟動Tomcat容器,或者說創建一個Tomcat容器?
~ docker run --name xanxus_tomcat -p 8002:8080 -d tomcat:8.5.20-jre8
xanxus_tomcat是我自定義的這個容器的名稱
-p是映射對外的port。所以我這裡對外設8002,容器內部是8080
-d是在背景執行,下了這個指令它執行後就不會卡在畫面還要按ctrl+c跳出,可以去做別的事情,就算關掉終端機也不會停止

加上--restart,讓容器會自動重新啟動:
~ sudo docker run --restart always --name XanxusTestTomcat -p 80XX:8080 -d tomcat:8.5.23-jre8
可以在網址列輸入 http://XXX.XXX.XX.X:8002/
測試看看是否成功

列出目前已啟動的容器:
~ docker ps

列出所有已創建的容器:
~ docker ps -a

接下來是重點!要把war檔放到Tomcat的webapps中
先進去跑在docker上的tomcat
~ docker exec -it xanxus_tomcat /bin/bash
前面的指令變這樣root@fde73f0e3ba6:/usr/local/tomcat#

查看一下目錄結構,以便把檔案丟進來:
root@fde73f0e3ba6:/usr/local/tomcat# ls
通常會有一個webapps

離開:
root@fde73f0e3ba6:/usr/local/tomcat# exit

把war檔複製進去:
~ docker cp Desktop/SimplifyRoute.war fde73f0e3ba6:/usr/local/tomcat/webapps
fde73f0e3ba6是目標容器的ID
Desktop/SimplifyRoute.war是本機端的目錄,找到你要放進去的檔案
/usr/local/tomcat/webapps是你要放入目標的資料夾路徑

再進去一次:
~ docker exec -it xanxus_tomcat /bin/bash

切到webapps:
root@fde73f0e3ba6:/usr/local/tomcat# cd webapps

ls查看一下:
root@fde73f0e3ba6:/usr/local/tomcat/webapps# ls
ROOT  SimplifyRoute  
SimplifyRoute.war
docs  examples
host-manager  manager
這樣就算成功了,可以去網址列測試。

其他常用指令:
停止容器,xanxus_tomcat是你要停止的容器的名稱:
~ docker stop xanxus_tomcat
啟動容器:
~ docker start xanxus_tomcat

重啟容器:
~ docker restart xanxus_tomcat
查詢某個容器的對應的port:
~ docker port xanxus_tomcat 8080/tcp -> 0.0.0.0:8002
刪除未啟動的容器:
~ docker rm xanxus_tomcat
列出目前在本地的映像檔:
~ docker images
刪除某個映像檔(記得要把使用這個映像檔的容器刪掉,不然可能無法完整刪除):
~ docker rmi 5f86ff0436e8
刪除映像檔有參考至其他映像檔無法刪除,可加-f指令:
~ docker rmi -f 5f86ff0436e8
參考:https://github.com/moby/moby/issues/26862
執行ubuntu的容器並進入容器的終端機:
~ docker run -it ubuntu
-it指令為進入該容器終端機

進入容器:
~ docker attach [容器的名字(非ID)]
將容器中的檔案複製到本地:
~ sudo docker cp 容器ID:/usr/local/tomcat/webapps/WebApplication2.war .
創建docker Mysql容器:
~ sudo docker run --name BFSMysqlMain -p 3XXX:3306 -e MYSQL_ROOT_PASSWORD=xxxx -d mysql:5.7.20
創建使用volume將mysql容器的東西對應到本地資料夾的容器(如此刪掉容器資料才會保存):
~ sudo docker run --restart=always --name TheContainerName -v $(pwd)/DockerMySQLData/Data1:/var/lib/mysql -p 127.0.0.1:3339:3306 -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql:5.7.21
加上-v 後面接對應的目錄,結構如下:本地目錄:容器目錄
$(pwd)/DockerMySQLData/Data1:/var/lib/mysql
如上敘述,即可將容器裡的/var/lib/mysql對應到 我現在這個位置的DockerMySQLData/Data1資料夾裡,所以Data1存放的資料就是容器裡的mysql這個資料夾的資料

創建有其他使用者的MySQL容器:
~ sudo docker run --restart=always  --name Test_MySQL -v $(pwd)/DockerMySQLData/Data1:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_USER=user1 -e MYSQL_PASSWORD=user1password -d mysql:5.7.22
這樣即可用user1和user1password這組帳號密碼登入了,但進去後會發現沒有權限創資料庫,所以記得要再用root給user1權限
用build指令從Dockfile變成Image:
~ sudo docker build -t xanxus/tomcat:8.5.28-jre9 .
Dockfile很像只能命名成Dockfile

用save指令將Image打包成本地的壓縮檔:
~ sudo docker save -o the-image-v1.tar the/image:v1
如此就可以將Image帶著走了
用load指令將壓縮檔變成Image:
~ sudo docker load --input the-image-v1.tar
創建可存取多個資料庫的phpMyAdmin:
~ sudo docker run --restart=always --name phpMyAdminName -d -e PMA_HOSTS=111.111.111.111,222.222.222.222 -e PMA_PORTS=1111,2222 -p 8080:80 phpmyadmin/phpmyadmin:4.7.9-1
如果資料庫很多的話建議把PMA_HOSTS和PMA_PORTS弄成環境變數,就可簡化成下面這樣:
~ sudo docker run --restart=always --name phpMyAdminName -d -e PMA_HOSTS=$PMA_HOSTS -e PMA_PORTS=$PMA_PORTS -p 8080:80 phpmyadmin/phpmyadmin:4.7.9-1
進入phpMyAdmin容器中:
~ sudo docker exec -it phpMyAdminName busybox ash
參考https://github.com/laradock/laradock/issues/480

★★★★★★★★實用★★★★★★★★
製作一個以這個容器為底的映像檔(是這樣說嗎?):
~ sudo docker commit CONTAINER_ID nginx-template
這功能蠻強大的!也就是說,我可以把一個正在跑,且裡面有部署我自己的程式的容器把它變成一個image檔後面的nginx-template是我這個image檔的名稱
這樣子,下次我要把程式移植到其他環境,我只要帶著這個image,以這個image再部署一次就可以了,我就不用再把程式再丟進去一次!非常方便!!

看容器的log:
~ sudo docker container logs -f afecacef22e7
afecacef22e7是容器ID

查看容器在系統中執行的行程的PID:
~ sudo docker top 6c53379a5f1b
6c53379a5f1b是容器的ID

將那些<none>的懸掛中的映像檔刪除:
docker rmi $(docker images -f "dangling=true" -q)


apt-get install build-essential
http://b8807053.pixnet.net/blog/post/3611782-build-essential

Ubuntu 升級/更新新版本 Kernel
https://www.phpini.com/linux/ubuntu-upgrade-kernel

沒有ifocnfig指令
https://linuxconfig.org/how-to-install-missing-ifconfig-command-on-debian-linux

Ubuntu Missing add-apt-repository command
http://lifeonubuntu.com/ubuntu-missing-add-apt-repository-command/

如何把已經創建好的Container再開對外Port
https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-docker-container

如果Contaier無法啟動(因可能是Ubuntu)
https://stackoverflow.com/questions/29957653/docker-container-not-starting-docker-start
要用-it啟動

將docker作為非root來管理
https://docs.docker.com/install/linux/linux-postinstall/

如果想要把一個容器開啟多個Port
https://stackoverflow.com/questions/20845056/how-can-i-expose-more-than-1-port-with-docker

Ubuntu 為什麼找不到 add-apt-repository 的指令 ?
$ sudo apt-get install software-properties-common
http://www.arthurtoday.com/2010/09/ubuntu-add-apt-repository.html

如果ufw不知為啥管理不了docker的服務,參考:
https://bit.ly/2y4RGJR

讓非root使用者,可不用打sudo就能用docker指令:
https://dockr.ly/2soTVSM

沒有留言:

張貼留言