--- tags: linux,server --- # Docker 使用 ## 安裝Docker [Docker官網](https://docs.docker.com/engine/install/ubuntu/) :::info 依照官網指示進行安裝即可使用 ::: ## Docker 架構 ![](https://i.imgur.com/v9cWNcK.png) ## 運行指令 ### Images Docker搜尋想使用的Image ``` docker search {Images} ``` 當找到想使用的Images,可使用pull的方式下載下來 ``` docker pull {Images} ``` 顯示目前本機擁有Image (沒有在使用的記得刪除,不然會佔空間) ``` docker images ``` 匯出目前本機擁有Image ``` docker save {Images ID} > {自取}.tar docker save -o {自取}.tar {Images ID} docker save --output {自取}.tar {Images ID} docker save {Images ID} | gzip > {自取}.tgz docker export {Container ID} > {自取}.tar docker export {Container ID} | gzip > {自取}.tgz docker push (請參照下面 Dcoker Hub) ``` 匯入Container Image ``` docker load < {檔名}.tar gunzip -c {自取}.tgz | docker load docker import {url} docker import {檔名}.tar docker pull (請參照下面 Dcoker Hub) ``` 匯出Docker內Mysql或MariaDB ``` docker exec {Container ID} /usr/bin/mysqldump -u root -p{資料庫密碼} -B {指定資料表}> {自訂}}.sql ``` 匯入Docker內Mysql或MariaDB ``` cat {自訂}}.sql | docker exec -i {Container ID} /usr/bin/mysql -p{資料庫密碼} ``` 啟動所有Container Image ``` docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) ``` 刪除目前本機擁有Image ``` docker rmi {Image ID} ``` Docker運行Image bash為Linux Shell,若無bash 可改用sh ``` docker run -itp 80:80 ubuntu /bin/bash ``` ``` docker run -idtp {本機port}:{docker port} -v {本機資料夾}:{容器資料夾} --network {網路名稱} --name {Container名稱(自取)} {Image ID} /bin/bash ``` :::warning CentOS無法使用systemctl,需更改為以下指令 ::: ``` docker run -p {本機port}:{docker port} --name {Container名稱(自取)} -d -t --privileged=true {Image ID} /usr/sbin/init(CMD依憑位置) ``` :::info 資料庫的docker啟動指令 ::: ``` docker run -itd --name {Container名稱(自取)} -p {本機port}:{docker port} -e MYSQL_ROOT_PASSWORD={自訂密碼} {Image ID} ``` ___ ### Container 查看Docker Container ``` docker ps -a ``` 啟動Container Image ``` docker start {Container ID} ``` 停止Container Image ``` docker stop {Container ID} ``` 關閉Container Image ``` docker kill {Container ID} ``` 刪除Container Image ``` docker rm {Container ID} ``` 進入Container Image ``` docker exec -it {Container ID} bash/sh ``` 查看Docker IP (一般Shell指令) ``` docker inspect {Container ID} ``` 查看Docker IP (進入Container之後) ``` cat /etc/hosts ``` 啟動Container內服務(進入Container之後) ``` cd /etc/init.d ./{服務} start ``` :::info CentOS預設服務是關閉的 故需要手動進入並啟用 ::: 更改Container port(不建議) ``` docker stop {Container ID} vi /var/lib/docker/containers/{container_id}/hostconfig.json ``` ```bash= ....... "PortBindings": { "80/tcp": [//Container內的port { "HostIp": "", "HostPort": "11080"//改為想導出的Port } ] }, ....... ``` ``` service docker restart docker start {Container ID} ``` ___ ## 自製 Docker Image 先創造放置Dockerfile資料夾 ``` mkdir {資料夾} ``` 進入Dockerfile資料夾 ``` cd {資料夾} ``` 建立檔案Dockerfile ``` touch Dockerfile ``` 編輯Dockerfile(docker build預設使用文件為Dockerfile) ``` vi Dockerfile ``` 格式 ```bash= FROM centos:7 MAINTAINER 作者名 <example@gmail.com> WORKDIR /data RUN yum update -y \ && yum install -y httpd \ ENV PATH $PATH:/nodejs/bin ``` ```bash= FROM ubuntu MAINTAINER James RUN apt-get update -y \ && apt-get upgrade -y \ && apt-get install vim -y \ && apt-get install nginx -y ENTRYPOINT service nginx restart && /bin/bash #因Docker 預設無法自行啟動程式 所以使用Dockerfile撰寫容器啟動時服務啟動 ``` :::info FROM:選擇改良的Docker Image做為基底 MAINTAINER:製作者訊息 WORKDIR:指定docker執行起來時候的預設目錄位置 RUN:指定build過程中所要執行的指令與安裝動作 ADD:指定build過程中所要抓取、解壓縮檔案(網址路徑),==內容不包含最頂層== COPY:指定build過程中所要複製的檔案(本地>Image),==內容不包含最頂層== ENV: 指令啟動後的環境變數 CMD: 指定Instance啟動後所要執行的指令 ::: 撰寫完成後,將Dockerfile建立成Image ``` docker build . docker build -f 指定Dockerfile名稱 -t 自訂生成名稱 . ``` ## Docker Hub Docker 官方提供的儲存平台 若要使用 請先建立Docker帳戶 https://hub.docker.com/ ![](https://i.imgur.com/Ssg5Jna.png) 登入後即可編輯、修改上傳的Docker Image ![](https://i.imgur.com/6oiKmAM.png) ### 上傳、下載Docker Images 先將Docker Container Commit ``` docker commit -m {詳細訊息} -a {作者訊息} {Container ID} {Image REPOSITORY}:{版本} ``` 或是Docker Image加上tag ``` docker tag {Image ID} {Image REPOSITORY}:{版本} ``` :::info Image REPOSITORY 要取為 {帳戶名稱/自取} ::: 登入註冊好的Docker Hub ``` docker login ``` 上傳Docker image到Docker Hub ``` docker push {Image REPOSITORY}:{版本} ``` 從Docker Hub下載Docker image ``` docker pull {Image REPOSITORY}:{版本} ```