docker的使用
dockerfile編寫
目的
在docker中安裝java環境,并部署tomcat。使tomcat的webapps目錄映射到宿主機中。并且在tomcat中部署java web服務,使用docker容器啟動 java web直接啟動。
dockfile編寫
#基于的基礎鏡像
FROM centos:7
#指明鏡像維護者信息
MAINTAINER shuaidong@126.com
#COPY jdk and tomcat into image
#在docker中創建一個文件
RUN mkdir /app
RUN touch /etc/test
#將一串文字輸出到/etc/test文件中,注意這里必須在前面加上/bin/bash -c ,后面命令用‘’單引號擴起來不然會報錯
RUN /bin/bash -c 'echo "10.205.133.127 master" >> /etc/test'
RUN /bin/bash -c 'echo "10.205.108.47 slave01" >> /etc/test'
RUN /bin/bash -c 'echo "10.205.107.51 slave02" >> /etc/test'
RUN /bin/bash -c 'echo "10.205.108.165 slave03" >> /etc/test'
#創建一個掛載點,從容器到宿主機
VOLUME ["/app/apache-tomcat-8.5.20/webapps"]
#將宿主機的apache-tomcat-8.5.20復制到鏡像到/app/下
ADD apache-tomcat-8.5.20 /app/apache-tomcat-8.5.20
ADD jdk-8u131-linux-x64.rpm /app/jdk-8u131-linux-x64.rpm
ADD Service.war /app/apache-tomcat-8.5.20/webapps/Service.war
RUN rpm -ivh /app/jdk-8u131-linux-x64.rpm
#設置環境變量
ENV CATALINA_HOME /app/apache-tomcat-8.5.20
ENV PATH $PATH:$CATALINA_HOME/bin
#暴露對外的服務端口
EXPOSE 8080
#同CMD命令,但不會被docker run提供的參數覆蓋。
ENTRYPOINT ["/app/apache-tomcat-8.5.20/bin/catalina.sh","run"]
創建鏡像命令
使用當前目錄的dockfile創建一個鏡像,鏡像名為webapp
docker build -t webapp .
運行一個容器,并添加hosts
給容器添加hosts,注意給容器添加hosts,沒有辦法在鏡像中直接使用RUN 命令修改/etc/hosts中的文件。因為這樣雖然修改鏡像中/etc/hosts.而鏡像在創建成容器的時候,容器的ip改變了,其中的hosts文件也會發生改變。所以就算這樣做了,也是沒有效果的。
解決辦法:我們在運行容器的時候給起添加一個hosts
docker run --privileged -itd --name deviceauthservice --add-host master:172.16.88.179 --add-host slave01:172.16.88.64 --add-host slave01:172.16.88.62 --add-host slave01:172.16.88.173 -p 9999:8080 a9147221c42d
服務啟動了,常用命令維護容器中的服務
-
查看容器中的logs
docker logs -f 容器id
-
查看容器中映射在宿主機中的目錄對應關系
docker inspect -f "{{.Volumes}}" 容器id
3.也可以將容器中的logs日志文件映射到宿主機上進行查看,通過在運行容器時指定
```
docker run -v /home/syx/logs:/logs ubuntu
```
命令解釋:將宿主機的目錄/home/syx/logs映射到容器的/logs目錄下。這個指定宿主機目錄掛在到容器上是dockerfile做不到的。
dockerfile的命令
FROM
基于哪個鏡像
RUN
安裝軟件用
MAINTAINER
鏡像創建者
CMD
Container啟動時執行的命令,但是一個Dockerfile中只能有一條CMD命令,多條則只執行最后一條CMD.
ENTRYPOINT
container啟動時執行的命令,但是一個Dockerfile中只能有一條ENTRYPOINT命令,如果多條,則只執行最后一條
cmd和ENTRYPOINT區別: ENTRYPOINT可以在運行容器的時候才指定運行命令的參數
例子
使用下面的ENTRYPOINT構造鏡像:
ENTRYPOINT ["/bin/echo"]
那么docker build出來的鏡像以后的容器功能就像一個/bin/echo程序:
比如我build出來的鏡像名稱叫imageecho,那么我可以這樣用它:
docker run -it imageecho “this is a test”
這里就會輸出”this is a test”這串字符,而這個imageecho鏡像對應的容器表現出來的功能就像一個echo程序一樣。 你添加的參數“this is a test”會添加到ENTRYPOINT后面。
USER
使用哪個用戶跑container
EXPOSE
container內部服務開啟的端口。主機上要用還得在啟動container時,做host-container的端口映射:
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
命令解釋:container ssh服務的22端口被映射到主機的33301端口
ENV
用來設置環境變量,比如:
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ADD
將文件<src>拷貝到container的文件系統對應的路徑<dest>
所有拷貝到container中的文件和文件夾權限為0755,uid和gid為0
- 如果要ADD本地文件,則本地文件必須在 docker build <PATH>,指定的<PATH>目錄下
- 如果要ADD遠程文件,則遠程文件必須在 docker build <PATH>,指定的<PATH>目錄下。
比如docker build github.com/creack/docker-firefox
VOLUME
可以將本地文件夾或者其他container的文件夾掛載到container中。
但是還有另一件只有-v參數能夠做到而Dockerfile是做不到的事情就是在容器上掛載指定的主機目錄.例如:
docker run -v /home/syx/dockerfile:/data ubun
WORKDIR
切換目錄用,可以多次切換(相當于cd命令),對RUN,CMD,ENTRYPOINT生效
docker build
-f Dockerfile的完整路徑
-t 鏡像的名字及tag,通常name:tag或者name格式;可以在一次構建中為一個鏡像設置多個tag
例如:使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像。
docker build github.com/creack/docker-firefox
使用當前目錄的Dockerfile創建鏡像。
docker build -t runoob/ubuntu:v1 .
使用指定目錄/app下dockerfile創建鏡像名為webapp鏡像,dockerfile中用的資源路經在當前目錄下
docker build -f /app -t webapp .
docker鏡像以及數據位置
Docker的鏡像以及一些數據都是在/var/lib/docker目錄下
docker創建橋接子網
sudo docker network create --driver bridge --subnet 172.25.0.0/16 device-bri
運行容器時給容器指定ip地址
sudo docker run -itd --name test3 --ip=172.25.0.100 --network=device 3db94df3e006