iT邦幫忙

14

Docker 基礎指令筆記

此為拿來記錄學習時候做的筆記,好方便自己整理所吸收的知識,有錯誤再麻煩告知。

1. 顯示執行中的Container。

docker ps [OPTION]
OPTION 意義
-a 顯示所有Container,包括未啟動的Container
-n 顯示 n 個最後(最新)創建的Container

2. 刪除 Container

docker rm [CONTAINER]

3. 顯示Images。

docker images

4. 刪除 Image

docker rmi [IMAGE]

5. 透過Image產生Container

docker run [OPTION] [IMAGE]

標準的建立Container並執行指令
當我們在終端機下docker run [image]時,會產生Container並以前台姿勢進入容器內(attached狀態),此時無法跟Container互動,要透過OPTION指令才能與之互動,若平常時只需要將起Container啟動在後台,則只需要docker run -d [Image],因為無需互動,不需要-it。

OPTION 意義
-i (interactive) -i = Keep STDIN open even if not attached,沒有 -i 的話 container 就收不到你打的字,所以當需要與Container做互動(輸入指令給Container,Container會回傳指令結果)時會用。
-t (terminal) 透過terminal模式進入Container。
-d (detach) 讓Container處於後台運行,d=detached(分離的)。
-p (port) 設定主機主機的port轉接到Container的port,ex: -p 8080:80 代表把主機的8080 port所有流量轉發到web這個Container的80 port。
--name 指定這個Container的名字。
$ docker run -itd -p 6666:7777 --name myubuntu ubuntu
8a24bd2e4239cd42b0c8cc55c73c6030760c6a5cef02b728d181d7bd72dfc7bc
$ docker ps
CONTAINER ID   IMAGE  COMMAND    CREATED   STATUS   PORTS    NAMES
8a24bd2e4239   ubuntu    "/bin/bash"   33 seconds ago   Up 31 seconds   0.0.0.0:6666->7777/tcp, :::6666->7777/tcp   myubuntu

6. 進入Container

在Docker中有兩種做法

  • docker attach

docker attach [CONTAINER ID]

讓在背景執行的Container回到前台,要注意退出時可能會使Container也跟著被關閉。

$ docker run -itd ubuntu
eafbed991e79124ded07c7fd312f06c0dc3e5e5ba723dc5f41f4e5877e8e1acb
$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
eafbed991e79   ubuntu    "/bin/bash"   3 seconds ago   Up 2 seconds             affectionate_beaver
$ docker attach eafbed991e79
root@eafbed991e79:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@eafbed991e79:/# whoami
root
  • docker exec

docker exec -it [CONTAINER ID] [COMMAND]

以終端機模式進入Container,且退出時也不會使Container關閉,所以較推薦此方法。

$ docker run -itd ubuntu
c6e841452580e9b08c051b9d13cffe5bf833331e6eb64680cf5355482683cd12
$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS      PORTS     NAMES
c6e841452580   ubuntu    "/bin/bash"   5 minutes ago   Up 5 minutes  gracious_swirles
$ docker exec -it c6e841452580 bash
root@c6e841452580:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@c6e841452580:/# exit
exit
$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
c6e841452580   ubuntu    "/bin/bash"   5 minutes ago   Up 5 minutes             gracious_swirles

7. 在外部向執行中的Container內部下指令

docker exec [OPTION] [CONTAINER ID] [COMMAND]

這個指令很簡單,就是在外部向執行中的Container內部下指令,此時會呼叫Container內部的shell程式來執行你下的指令。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS             PORTS     NAMES
c6e841452580   ubuntu    "/bin/bash"   About an hour ago   Up About an hour             gracious_swirles
$ docker exec c6e841452580 whoami
root

8. Dockerfile

在Docker的世界中,,所有Container都需要透過Image來建立,但從Dockerhub上Pull下來的Image未必滿足我們的需求,此時可以透過Dockerfile來建置自己的Image,換句話說Dockerfile就是客製化Image的腳本。

docker build -t myImage .

Dockerfile結構大致分為四個部分

  1. 基礎映像檔(image)資訊
  2. 維護者資訊
  3. 映像檔操作指令
  4. 容器啟動時需執行的指令
FROM ubuntu:18.04

MAINTAINER shawn

EXPOSE 8080

WORKDIR /app

COPY application.jar /

RUN tar zxvf apache-tomcat-7.0.82.tar.gz

ENV JAVA_HOME=/jdk1.8.0_152
ENV PATH=$PATH:/jdk1.8.0_152/bin

CMD ["/apache-tomcat-7.0.82/bin/catalina.sh", "run"]
  • FROM:使用到的 Docker Image 名稱。

  • MAINTAINER:說明,撰寫和維護這個Dockerfile的人是誰。

  • EXPOSE:設定容器運行時提供服務的通訊埠。

  • WORKDIR:設定當前的工作目錄

  • COPY: 把本機(Local)的檔案複製到Image裡,第一個參數為local檔案的位置,第二個參數為此檔案想放在容器裡的位置。

  • RUN:最重要的部分,RUN指令後面放Linux指令(因為base image是ubuntu),想要在Image上設定或安裝都須將命令寫於此,用來執行安裝和設定這個Image需要的東西。

  • ENV:用來設定容器的環境變數。

  • CMD:當此執行docker run時會執行的指令,要特別注意的事如下

  1. Dockerfile中只能有一行CMD,若有多行CMD,則只有最後一行會生效。
  2. 若在建立Container時有帶執行的命令,則CMD的指令會被蓋掉。
    例如:單純執行docker run 時,CMD所定義的指令一樣會被執行,但當執行docker run bash時,因為多了bash指令,Container就會執行bash,而原本CMD中定義的值就會被覆蓋。

其他常用指令

  • ADD:基本上與COPY相同,都能從複製本地檔案到容器中,但有兩個地方不太一樣
  1. ADD的一個特性是有能力自動解壓檔案。所以如果是個可識別的壓縮格式(tar, gzip, bzip2, etc)的本地檔案,就會被解壓到指定容器檔案系統的路徑。
  2. ADD指令可以使用URL作為參數。當遇到URL時候,可以通過URL下載檔案且複製到指定位置,例子如下
ADD http://foo.com/bar.go /myapp

所以建議使用COPY而非ADD,因為若你想從遠端下載的話,不如直接使用 RUN wget ...

  • ENTRYPOINT:和CMD一樣,用來設定Container啟動時要執行的指令,不一樣的是,ENTRYPOINT一定會被執行,而且不會有像CMD有覆蓋的情況發生使用ENTRYPOINT的注意事項如下:
  1. Dockerfile中只能有一行ENTRYPOINT,如果有多行ENTRYPOINT,則只有最後一行會生效而已。
  2. 如果在建立Container時有帶執行的命令,ENTRYPOINT的指令不會被覆蓋,也就是說一定會執行。
  3. 如果想要覆蓋ENTRYPOINT的預設值,只要在啟動Container時加上「–entrypoint」參數,例如:docker run –entrypoint即可


尚未有邦友留言

立即登入留言