---
# System prepended metadata

title: Docker 使用
tags: [Server]

---

# Docker 使用
###### tags: `Server`

[TOC]

## 安裝 Docker
[Docker官網](https://docs.docker.com/engine/install/ubuntu/)

:::info
HackMD 是讓你快速撰寫筆記，流暢管理知識，支援多種衍生功能的生產力工具
:::

## Docker 架構

![](https://i.imgur.com/NVwMAU7.png)

## 運行指令

### Images

Docker 搜尋想使用的 Image
```shell=
docker search {Images}
```

當找到想使用的 Images，可使用 pull 的方式下載下來
```shell=
docker pull {Images}
```

顯示目前本機擁有 Image (沒有使用的記得刪除，不然會占空間)
```shell=
docker images
```

匯出目前本機擁有 Image
```shell=
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
```shell=
docker load < {檔名}.tar
gunzip -c {自取}.tgz | docker load
docker import {url}
docker import {檔名}.tar
docker pull (請參照下面 Dcoker Hub)
```

匯出Docker內Mysql或MariaDB
```shell=
docker exec {Container ID} /usr/bin/mysqldump -u root -p{資料庫密碼} -B {指定資料表}> {自訂}}.sql 
```
匯入Docker內Mysql或MariaDB
```shell=
cat {自訂}}.sql | docker exec -i {Container ID} /usr/bin/mysql -p{資料庫密碼}
```
啟動所有 Container Image
```shell=
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
```
刪除目前本機擁有的 Image
```shell=
docker rmi {Image ID}
```
Docker 運行 Image
```shell=
docker run -d -itp 80:80 ubuntu /bin/bash
```
```shell=
docker run -idtp {本機port}:{docker port} -v {本機資料夾}:{容器資料夾} --network {網路名稱} --name {Container名稱(自取)} {Image ID} /bin/bash
```

:::warning
CentOS無法使用systemctl，需更改為以下指令
:::
```shell=
docker run -p {本機port}:{docker port} --name {Container名稱(自取)} -d -t --privileged=true {Image ID}  /usr/sbin/init(CMD依憑位置)
```

:::info
CentOS無法使用systemctl，需更改為以下指令
:::
```shell=
docker run -itd --name {Container名稱(自取)} -p {本機port}:{docker port} -e MYSQL_ROOT_PASSWORD={自訂密碼} {Image ID}
```


---

### Container
查看 Docker Container
```shell=
docker ps -a
```
啟動 Container Image
```shell=
docker start {Container ID}
```
停用 Container Image
```shell=
docker stop {Container ID}
```
關閉 Container Image
```shell=
docker kill {Container ID}
```
刪除 Conatiner Image
```shell=
docker rm {Container ID}
```
進入 Container Image
```shell=
docker exec -it {Container ID} bash/sh
```
查看Docker IP (一般Shell指令)
```shell=
docker inspect {Container ID}
```
查看Docker IP (進入Container之後)
```shell=
cat /etc/hosts
```
啟動Container內服務(進入Container之後)
```shell=
cd /etc/init.d
./{服務} start
```
:::info
CentOS無法使用systemctl，需更改為以下指令
:::
更改Container port(不建議)
```shell=
docker stop {Container ID}
vi /var/lib/docker/containers/{container_id}/hostconfig.json
```
```shell=
.......
"PortBindings": {
    "80/tcp": [//Container內的port
            {
            "HostIp": "",
            "HostPort": "11080"//改為想導出的Port
            }
        ]
    },
.......
```
```shell=
service docker restart 
docker start {Container ID}
```

## 自製 Docker Image
先創造放置Dockerfile資料夾，進入Dockerfile資料夾
```shell=
mkdir {資料夾}
cd {資料夾}
```
建立檔案 Dockerfile
```shell=
touch Dockerfile
```
編輯Dockerfile(docker build預設使用文件為Dockerfile)
```shell=
vi Dockerfile
```
格式
```shell=
FROM centos:7
MAINTAINER 作者名 <example@gmail.com>
WORKDIR /data
RUN yum update -y \
&& yum install -y httpd \
ENV PATH $PATH:/nodejs/bin
```
```shell=
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
```shell=
docker build .
docker build -f 指定Dockerfile名稱 -t 自訂生成名稱 .
```
## Docker Hub
Docker 官方提供的儲存平台
若要使用 請先建立Docker帳戶
https://hub.docker.com/
登入後即可編輯、修改上傳的Docker Image
### 上傳、下載Docker Images
先將Docker Container Commit
```shell=
docker commit -m {詳細訊息} -a {作者訊息} {Container ID} {Image REPOSITORY}:{版本}
```
或是Docker Image加上tag
```shell=
docker tag {Image ID} {Image REPOSITORY}:{版本}
```
:::info
Image REPOSITORY 要取為 {帳戶名稱/自取}
:::
登入註冊好的Docker Hub
```shell=
docker login
```
上傳Docker image到Docker Hub
```shell=
docker push {Image REPOSITORY}:{版本}
```
從Docker Hub下載Docker image
```shell=
docker pull {Image REPOSITORY}:{版本}
```
