---
# System prepended metadata

title: Docker
tags: [Docker]

---

Docker
===
---

###### tags: `Docker`
記載著學習過程中，關於 docker 的筆記

---

[TOC]

# My docker repos
https://hub.docker.com/repository/docker/ljptw/ubuntu_for_pwner
這裡有 ubuntu16, 18, 19, 20 
我自己建立的拿來打 pwn 的 image 可以下喔 ouo
(預計還會加 ubuntu14)
(下載的套件列在連結中)

# 下載
[照著官方手冊的步驟下載](https://docs.docker.com/v17.12/install/linux/docker-ce/ubuntu/#set-up-the-repository)

# 概念
所有不懂在幹嘛的指令只要後面加 `--help` 就能知道在幹嘛

![](https://miro.medium.com/max/750/1*joAfS_1sBhCOJzJuaAzzeg.png)

`sudo usermod -aG docker [USERNAME]`
將自己使用者加入到 docker group，如此一來就有用跟 docker 有關指令的權限

`docker image ls`
可以看到你 local 端所有的 image

`docker container ls -a`
可以看到你 local 端所有的 container 的狀態

每個 container 都基於某個 image 而創出來

`docker pull [IMAGE](:[TAG])`
可以從公開 Docker Hub 上抓下某個 image
(有點像 github clone)
後面 TAG 可以再細選版號

`docker container start [CONTAINER]`
將特定 CONTAINER run 起來

`docker container attach [CONTAINER]`    
進入特定 CONTAINER

`docker run --name [CONTAINER] -it [IMAGE]`
從特定 IMAGE create 出 CONTAINER，並且 start 此 CONTAINER
it 參數為創立交互式 tty，讓你能在 CONTAINER 裡面下指令

離開 CONTAINER 而不 stop 它的方式是按下 Ctrl+p 再 Ctrl+q

# Ubuntu
直接以我架設自訂的 Ubuntu 為例子，image 來源為
https://hub.docker.com/_/ubuntu

## 下載 Image
`docker pull ubuntu:18.04`

## 創造 Container
`docker run --name ubuntu18 -itd ubuntu:18.04`

## 開 shell
`docker exec -it ubuntu18 /bin/bash`

這邊小小的提一下 `exec` 跟 `attach` 的差別
`exec` 是 fork 新的 process
`attach` 是黏上舊有的

所以連下兩個 `attach` 的結果就是兩個 terminal 的 output input 會一模一樣

## 設定
這 image 乾淨到連 ping, ip 都沒有，先來下載一下常用的東西
```
apt-get udpate
apt-get install iputils-ping iproute2 vim curl wget git
```

## 推上 hub
首先先登入 Docker hub，創造一個新 repos
![](https://i.imgur.com/fzsbXLo.png)

再來 commit，創造新的 image
`docker commit -m "Initialization: Install some common tools" -a "LJP" ubuntu18 ljptw/ubuntu:18.04`

可以用 `docker image ls -a` 看看，的確產生 `ljptw/ubuntu:18.04` Image

也可以用 `docker history ljptw/ubuntu:18.04` 看 commit 紀錄

再來就是 push，但要先登入 Docker Hub
`docker login`

push 囉
`docker push ljptw/ubuntu:18.04`

之後 pull 下來就能用了 讚讚

# 指令
## docker exec
```shell
man docker exec
```
對 running container 執行指令

## docker ps
```shell
man docker ps
```
查看所有 Container

## 應用
### 進入 container
要用到指令 docker exec 和 docker ps
先以 docker ps 查看要進入的 container 的 id
再下指令
```shell
docker exec -it 79e768bd215c /bin/bash
```
其中的 `79e768bd215c` 需替換為 container id




# Reference
好文:
https://medium.com/@sh.tsang/docker-tutorial-4-exporting-container-and-saving-image-c3a7d792cfb6

圖片來源: 
https://medium.com/@sh.tsang/docker-tutorial-4-exporting-container-and-saving-image-c3a7d792cfb6