常用命令:
docker倉庫:hub.docker.com
docker pull 下載鏡像,有可能因為鏡像名被轉移到新得鏡像身上,所以可能會出現null得虛懸鏡像pull/build
docker run -it --rm ubuntu:16.04 bash // 以交互的模式運行容器
docker exec -it ubuntu的容器id bash // 以交互的模式進入容器
docker run -p 8080:8080 tomcat // 將宿主機的8080端口映射到容器的8080,所以還可以是80:8080 啟動tomcat 可以在端口號后邊起容器的名字如 docker run -p 80:8080 --name tom1 tomcat
docker run -p 80:8080 --name tomcat1 -d tomcat // 以守護態運行
docker container tomcat1 // 刪除所有終止的容器
docker ps
docker ps -a
docker rm 容器id
docker rmi
docker images
exit/Ctrl + D 退出容器
Docker獲取鏡像
docker pull ubuntu:16.04 命令中沒有給出Docker鏡像倉庫的地址,因此會從Docker Hub獲取鏡像。
顯示鏡像:docker image ls
運行
docker run -it --rm
ubuntu:16.04
bash
運行基於ubuntu:16.04啟動一個容器
-it 以交互的形式運行容器
\ 命令太長的換行符
--rm 退出容器自動刪除該容器
退出容器 exit/Ctrl+D
看正在運行的容器 docker ps
看所有的容器 docker ps -a
更新鏡像 docker pull ubuntu16.04 即重新拉一次
鏡像體積
虛懸鏡像
:即鏡像既沒有倉庫名,也沒有標簽,均為
原因是由docker pull和docker build時,因為官方鏡像維護后,發布新版本,原來的鏡像被轉義到了新下載的鏡像身上,而舊的鏡像上的名字則被取消。
可以用以下命令專門顯示這類鏡像
對於Centos/RHEL的用戶來說,在沒有辦法使用UnionFSd的情況下,一定要配置direct-lvm給devicemapper,無論是為了性能、穩定性還是空間利用率。
docker image rm ubuntu16.04;刪容器
docker rmi 鏡像id 刪鏡像
Dockerfile
Dockerfile腳本 用這個腳本來構建、定制進行
Dockerfile是一個文本文件,內包含一條條的指令,每一條指令構建一層
docker pull tomcat
docker images
docker image ls
docker run -it
tomcat
bash
此時路徑為:/usr/local/tomcat
ls -al
自己裝的軟件必須安裝在/usr/local
cd webapps ll
cd ROOT/
ls -al
echo "hello" > test.txt
docker run -8080:8080 tomcat
docker ps
docker ps -a
docker rm 容器id
docker images
docker run -p 8080:8080 tomcat
from tomcat為文件第一行
所有的dockerfile腳本必須有一個基礎鏡像
run <命令> <尖括號為必填內容>
docker run -it --rm tomcat bash
ls -al
cd webapps/
cd ROOT/
ls -al
pwd
在/usr/local/docker 下創建一個目錄
mkdir tomcat
cd tomcat/
ll
vi Dockerfile
FROM tomcat
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html
cat Dockerfile
寫完腳本開始構建鏡像
docker build -t shop .
其中. 表示當前目錄,鏡像的構建需要基於dockerfile當前目錄 shop是標簽,起的名字
docker run -it shop bash
ls -al
cd webapps/
ls -al
cd ROOT/
ls -al
cat index.html
刪除ROOT目錄所有文件
vi Dockerfile
FROM tomcat
RUN cd /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html
報錯了,把ROOT目錄也刪除了,
docker images
vi Dockerfile
FROM tomcat
WORKDIR cd /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html
docker run -it --rm shop bash
ls -al
docker image prune
docker rmi imageID
容器是基於鏡像的
先退出容器
docker ps
docker ps -a
docker ps imageID
docker build -t mysql .
尋找Dockfile 構建一個鏡像上下文(Context)
cd /usr/local/docker/
ll
rm -fr mysql/
ll
cd com
rm -fr ROOT/
ll
cd tomcat/
HOST OS宿主機上操作docker build -t shop
將當前目錄打包,請求RESTAPI,還帶着這個目錄的壓縮包,
Docker Server接收Docker build 解壓縮,構建鏡像
COPY ./package.json /app/
這並不是要復制執行docker build 命令所在目錄下的package.json,也不是復制DOckerfile所在目錄下的package.json,而是復制上下文(context)目錄下的package.json。這個命令中的源文件的路徑是相對路徑
拷貝index.html到
FROM tomcat
COPY index.html /usr/local/tomcat/webapps/ROOT/
docker build -t shop .
docker run -it --rm shop bash
學習要有目的性,以最快的方式完成任務
部署項目到Docker容器
- 拷貝shop.zip -> tomcat/webapps/ROOT/
- 修改訪問端口號為80
COPY <源路徑>...<目標路徑>
// 源路徑指的是上下文路徑,即文件在docker server解壓后得路徑,目標路徑指的是鏡像內得路徑如 /usr/local/tomcat/webapps/ROOT
vi Dockerfile
FROM tomcat
COPY shop.zip /usr/local/tomcat/webapps/ROOT
RUN unzip shop.zip
WORKDIR 為工作目錄,如果目錄不存在,WORKDIR會幫你建立目錄
每一個指令都會構建一個分層
每一個RUN都是啟動一個容器,即使失敗了,也啟動了,會導致直接刪除了不了鏡像,所以需要先回去把該容器刪除再刪鏡像 正常情況下,--rm 會自動刪除
vi Dockerfile
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
COPY shop.zip .
RUN unzip shop.zip
:wq!
build -t shop .
解壓縮之后還需要一個命令
vi Dockerfile
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr * #刪除ROOT目錄下所有內容
COPY shop.zip .
RUN unzip shop.zip
RUN rm -fr shop.zip
WORKDIR /usr/local/tomcat #切換到鏡像本身的工作空間
:wq!
build -t shop .
ADD
ADD指令和COPY的格式和性質基本一致 ADD指令會自動解壓縮這個文件到<目標路徑>中去
vi Dockerfile
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -fr *
ADD shop.tar.gz .
WORKDIR /usr/local/tomcat
:wq!
docker build -t shop .
可以看到他是把整個目錄都打包了體積變的越來越大
docker run -it --rm shop bash
cd webapps/
cd ROOT/
ls -al
可以看到自動解壓縮了,並且原來的tar包也被刪除了
但是某些情況下,如果我們真的是希望復制個壓縮文件進去,而不解壓縮,這時就不可以使用ADD命令了。
接下來是修改端口號為80
docker image prune
docker run -p 8080:8080 tomcat
-p 的意思是 port端口
EXPOSE <端口1> [<端口2>...]
EXPOSE指令只是一個聲明,運行時並不會因為這個聲明應用就會開啟這個端口的服務。
在dockerfile中寫入這樣的聲明有兩個好處,一個是幫助進行使用者理解這個鏡像服務的守護端口,以方便配置映射;另一個好處是在運行時使用隨機端口映射時,也就是
docker run -P時,會自動隨機映射EXPOSE的端口
EXPOSE 8080:8080 暴露端口號
** CMD [參數2,參數2...]**
一個容器就是一個進程,一個程序
設置腳本時 設置參數的占位符 如$1、$2
test.sh
SET PATH=$1
test.sh /usr/local/tomcat
其中/usr/local/tomcat就是路徑傳入的參數
如傳入三個參數 catalina.sh run stop restart成功的話, 則在catalina.sh中是有三個占位符的
docker build -t 鏡像名稱 .
構建實際上是打包本目錄文件到服務端去構建然后返回響應內容
鏡像上下文-》指的是打包后到docker server中解壓后得目錄(而不是宿主機得目錄)