第一本Docker書讀書筆記

 

 平常使用命令python

1.中止全部的container,這樣纔可以刪除其中的images:web

docker stop $(docker ps -a -q)

若是想要刪除全部container的話再加一個指令:spring

docker rm $(docker ps -a -q)

2.查看當前有些什麼imagesdocker

docker images

3.刪除images,經過image的id來指定刪除誰shell

docker rmi <image id>

想要刪除untagged images,也就是那些id爲<None>的image的話能夠用ubuntu

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要刪除所有image的話數組

docker rmi $(docker images -q)

 4進入已中止的容器緩存

sudo docker start 容器id
sudo docker exec -i -t 容器id /bin/bash

5. 重命名鏡像名tomcat

docker tag 鏡像id 重命名:tag

6. 重命名容器名bash

dokcer rename 容器ID mytomcat7:jre7

 

正文

1)使用第一個交互式容器

sudo docker run -i -t ubuntu /bin/bash

-i 保證容器中STDIN是開啓的,保證持久的標準輸入

-t 爲建立的容器分配一個僞tty終端

綜上容器經過-it 提供了一個交互式的shell

1.首先Docker會檢查本地是否存在ubuntu鏡像,若是沒有,docker會鏈接官方維護的docker hub registry查看hub並下載該鏡像

2.隨後使用該鏡像再內部建立一個交互式的容器

3.登陸到該容器中以後,會顯示

user@容器id:/#

容器id名就是容器主機名

2)給容器命名

 若是不給docker建立的容器指定名稱,docker會爲其隨機指定一個名稱

若是要指定特定的名稱,使用--name標誌來實現

sudo docker run --name spec_name -i -t ubuntu /bin/bash

3)從新啓動已經中止的容器

sudo docker start spec_name

也能夠經過容器id啓動已經中止運行的容器

4)使用守護式容器

sudo docker run --name daemonizer_container -d ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"

-d 參數 使得容器會在後臺運行

5)查看容器內的進程

要查看容器內的進程,使用docker top命令

 

sudo docker top  daemonizer_container

 

6)docker 統計信息

利用stats命令,顯示一個或者多個容器的統計信息

sudo docker stats daemonizer_container (或後跟空格其餘容器)

7) 在容器內部運行進程

利用docker exec命令在容器內部額外啓動新進程

容器內運行的進程有兩種類型

1.後臺任務

2.交互式任務

sudo docker exec -d daemonizer_container touch /etc/new_file

-d標誌須要運行一個後臺進程,-d標誌以後,指定的是在內部執行這個命令的容器名字和要執行的命令

sudo docker exec -i -t daemonizer_container /bin/bash

這裏和運行交互式容器同樣,在容器內建立一個新的bash會話

8)中止守護式容器

sudo docker stop daemonizer_container

或者經過容器id來中止

sudo docker stop casa123ca23

若是想要查看已經中止的容器

使用

docker ps -a

只查看正在運行的容器

docker ps

9)自動重啓容器

因爲某種錯誤而致使容器中止運行,能夠經過--restart=always標誌,讓docker自動從新啓動該容器

sudo docker run --restart=always --name daemonizer_container -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done;

10)查看容器具體信息

經過docker inspect 來獲取更多的容器信息

sudo docker inspect daemonizer_container

11)刪除容器

若是容器已經再也不使用,可使用docker rm命令來刪除 (刪除前必須保證容器已經中止運行)

刪除指定的容器

sudo docker rm 容器id

刪除全部容器(注意這裏是`(1的左邊) 而不是') 

sudo docker rm `sudo docker ps -a -q`

-a 表示列出全部容器

-q 只返回容器的id 

`sudo docker ps -a -q` 返回容器id的列表

 12)建立一個自定義命名的最基本的容器

sudo docker run -i -t --name container_spec_name ubuntu /bin/bash

13)列出鏡像

sudo docker images

若是隻查看ubuntu相關鏡像

sudo docker images ubuntu

本地的鏡像都保存在docker宿主機的/var/lib/docker目錄下

能夠手動目錄查看

也能夠用

docker info

查看

  

14)從Docker hub查找可用鏡像

sudo docker search 用戶名/倉庫名

15)從Docker hub上面拉取鏡像

sudo docker pull 倉庫
例子
sudo docker pull ubuntu #未指定標籤,默認latest標籤

或者指定帶標籤的鏡像
sudo docker pull 倉庫:tag
例子
sudo docker pull ubuntu:16.04

16)從指定鏡像建立容器

sudo docker run -i -t 用戶名/倉庫名 /bin/bash

容器啓動命令:docker run --name 參數1 -p 參數2 -v 宿主機與容器交互的目錄文件 -d 後臺運行

 

docker run --name tomcat -p 8080:8080 -v /usr/test:/usr/local/tomcat/webapps/test -d tomcat

 

 

參數解釋:

 

--name tomcat 表示上一步安裝的鏡像名稱

 

-p 8080:8080 表示將容器的8080port映射到本機的8080port端口

 

-v /usr/test:/usr/local/tomcat/webapps/test 表示將本機下的usr目錄下的test文件夾映射到容器tomcat的webapps文件夾下

 

-d tomcat 表示在後臺守護進程的方式啓動(不進入後臺啓動),指定上一步安裝的鏡像名稱

 

17)構建鏡像方法

構建鏡像有兩種方法

  1. docker commit   #不推薦使用
  2. Dockerfile-->docker build  #推薦

其中Dockerfile支持DSL語法, 由指令和參數組成,支持註釋

18)登陸Docker hub

sudo docker login

登出

sudo docker logout

19)用Dockerfile構建鏡像

mkdir DOCKER
cd DOCKER
touch Dockerfile

編輯Dockerfile

FROM ubuntu:14.04
MAINTAINER jojo "12301@qq.com"
RUN apt-get update && apt-get install -y python
RUN echo "hello,docker"
EXPOSE 80

每一條指令都會建立一個新的鏡像層並對鏡像進行提交

20)基於Dockerfile執行docker build構建新鏡像

cd DOCKER

跳到Dockerfile目錄

sudo docker build -t="jojo/docker_test" .

注意 別忘記 .表明使用當前目錄的Dockerfile進行構建

也能夠指定具體的Dockerfile位置,使用-f標誌

docker build -t="用戶名/倉庫名" -f path/to/file

 

21)若是構建中失敗

因爲docker構建新鏡像是分層進行的,即Dockerfile每一次構建過程都會將結果提交爲鏡像,因此在某step失敗後,可根據最近的step容器id(屏幕輸出build過程)

調試哪裏錯了

修改Dockerfile

繼續build

sudo docker run -t -i 最近build的容器id /bin/bash

22)docker build 默認利用以前成功構建的鏡像層看成緩存,若是要重頭構建鏡像,確保構建過程不使用緩存可使用--no-cache標誌

 

sudo docker build --no-cache -t="jojo/docker_test" .

 

23)查看鏡像構建層或者構建歷史

使用docker history

sudo docker history 鏡像id

查看新構建的xx鏡像的每一層以及每一層的Dockerfile指令

24)使用-p選項映射 容器特定的端口到本地的宿主機端口

docker能夠經過兩種方法在宿主機分配端口

  1. 隨機選擇32768~61000較大的端口來映射到容器指定的端口上
  2. 指定具體端口號進行映射
sudo docker run -d -p 127.0.0.1:8080:80 --name container_name jojo/docker_test

上面的命令會將容器的80端口綁定到本地宿主機的127.0.0.1這個ip的8080端口上

但這會限制Docker的靈活性,所以docker 還提供了一個更簡單的方式,即-p參數,該參數能夠用來對外公開在Dockerfile中經過EXPOSE指令公開的全部端口

25)查看宿主機與容器的映射關係

docker ps -l #能夠查看端口映射

也能夠經過docker port 查看

sudo docker port 容器id 或 容器名

 或者

sudo docker port 鏡像id 端口號(如80)

26)Dockerfile 指令

1.CMD

用於指定一個容器啓動時要運行的命令.相似RUN指令是鏡像被構建時要運行的命令,而CMD是指定容器被啓動時要運行的命令

sudo docker run -t -i 用戶名/倉庫名 /bin/bash
至關於
sudo docker run -t -i 用戶名/倉庫名
+
CMD ["/bin/bash"]

2.WORKDIR

在容器內部設置一個工做目錄,使得CMD指令會在這個目錄下執行

WORKDIR /opt/webapp/db
RUN bundle install 
WORKDIR /opt/webapp #最終工做目錄設置爲 /opt/webapp
CMD ["rackup"]

也能夠經過-w標誌在運行時覆蓋工做目錄

sudo docker run -t -i /var/log ubuntu pwd

該命令會將容器內的工做目錄設置爲/var/log

3.ENV

ENV指令用在鏡像構建中設置環境變量

ENV RVM_PATH /home/rvm/

RVM_PATH即爲一個環境變量

ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR

也能夠經過-e標誌在運行時來傳遞環境變量

sudo docker run -t -i -e "WEB_PORT=8080" ubuntu env

這些環境變量也會被持久化保存到 咱們的鏡像建立的任何容器中

在容器終端中運行env命令

能夠查看環境變量

4.VOLUME

VOLUME指令用來向基於鏡像建立的容器添加捲

  1. 卷能夠在容器間共享和重用
  2. 一個容器能夠不是必須和其餘容器共享卷
  3. 對卷的修改是當即生效的
  4. 對卷的修改不會對更新鏡像產生影響
  5. 卷會一直存在直到沒有任何容器再使用

5.ADD

ADD指令用來將構建環境下的文件和目錄複製到鏡像中

文件複製

ADD source_file  target_file/to/path/source_file #構建目錄下的source_file複製到鏡像target_file/to/path/

目錄複製

ADD source_file/to/path/  target_file/to/path/  #源文件目錄位置 目的文件目錄位置

指向源文件的位置參數能夠試一個URL,或者構建上下文或者環境文件名或者目錄

不能對構建目錄或者上下文以外的文件進行ADD操做

使用URL做爲文件源

ADD http://wordpress.org/latest.zip /root/wordpress.zip

另外若是將一個歸檔文件(gzio,bzip2,xz)制定爲源文件,docker會自動將歸檔文件解開(unpack)

ADD latest.tar.gz /var/www/wordpress/

但docker不知道URL方式指定源位置中使用歸檔文件(書中所說,不肯定如今是否更新)

6.COPY

COPY與ADD類似,不一樣的是COPY只關心在構建上下文中複製本地文件,而不會去作提取和解壓工做,至關於縮水版ADD

同時COPY的複製路徑必須是一個絕對路徑,而且源路徑必須以"/"結尾,這樣docker會認爲它是目錄,若是目錄不存在,docker會自動化遞歸的建立所須要的目錄結構 至關於

mkdir -p  #遞歸的建立目錄

 

 27)push 鏡像到docker hub

這裏按照書上步驟遇到了denied: requested access to the resource is denied問題

鏡像構建完畢的時候 準備傳入本身hub發現 被拒絕

報了denied: requested access to the resource is denied異常,意思是沒有權限

解決的辦法是:使用 docker tag更名字

docker tag REPOSITORY名字 dockerhub的"用戶名/倉庫名"
docker push "用戶名/倉庫名"

 

 28)Docker鏡像保存save、加載load

(1)查看要要保存的鏡像的ID

docker images

(2)保存鏡像

docker save 鏡像名/鏡像id -o /home/wzh/docker/spring-boot-docker.tar

(3)加載鏡像

docker load -i spring-boot-docker.tar  

 

解決方案 參考

https://stackoverflow.com/questions/41984399/denied-requested-access-to-the-resource-is-denied-docker

相關文章
相關標籤/搜索