日常使用命令
1.停止所有的container,這樣才能夠刪除其中的images:
docker stop $(docker ps -a -q)
如果想要刪除所有container的話再加一個指令:
docker rm $(docker ps -a -q)
2.查看當前有些什麼images
docker images
3.刪除images,通過image的id來指定刪除誰
docker rmi <image id>
想要刪除untagged images,也就是那些id為<None>的image的話可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要刪除全部image的話
docker rmi $(docker images -q)
進入已停止的容器
sudo docker start 容器id
sudo docker exec -i -t 容器id /bin/bash
5. 重命名鏡像名
docker tag 鏡像id 重命名:tag
6. 重命名容器名
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)構建鏡像方法
構建鏡像有兩種方法
- docker commit #不推薦使用
- 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可以通過兩種方法在宿主機分配端口
- 隨機選擇32768~61000較大的端口來映射到容器指定的端口上
- 指定具體端口號進行映射
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指令用來向基於鏡像創建的容器添加捲
- 卷可以在容器間共享和重用
- 一個容器可以不是必須和其他容器共享卷
- 對卷的修改是立即生效的
- 對卷的修改不會對更新鏡像產生影響
- 卷會一直存在直到沒有任何容器再使用
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
(1)查看要要保存的鏡像的ID
docker images
(2)保存鏡像
docker save 鏡像名/鏡像id -o /home/wzh/docker/spring-boot-docker.tar
(3)加載鏡像
docker load -i spring-boot-docker.tar