Docker從入門到實(shí)踐

  • 基本概念

  1. 鏡像
    Docker 鏡像就是一個(gè)只讀的模板,鏡像可以用來(lái)創(chuàng)建 Docker 容器
  2. 容器
    容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例。 它可以被啟動(dòng)、 開(kāi)始、 停止、 刪除。 每個(gè)容器都是相互隔離的、 保證安全的平臺(tái)
  3. 倉(cāng)庫(kù)
    倉(cāng)庫(kù)是集中存放鏡像文件的場(chǎng)所.
    倉(cāng)庫(kù)注冊(cè)服務(wù)器上往往存放著多個(gè)倉(cāng)庫(kù), 每個(gè)倉(cāng)庫(kù)中又包含了多個(gè)鏡像,每個(gè)鏡像有不同的標(biāo)簽(tag)最大的公開(kāi)倉(cāng)庫(kù)是 Docker Hub, 存放了數(shù)量龐大的鏡像供用戶下載。 國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)包括 Docker Pool等, 可以提供大陸用戶更穩(wěn)定快速的訪問(wèn)。
    push命令上傳到倉(cāng)庫(kù)
    pull命令拉取一個(gè)鏡像
  • CENTOS 7 安裝Docker

#安裝Docker
sudo yum install docker
#啟動(dòng)Docker服務(wù)
sudo service docker start
#隨系統(tǒng)自動(dòng)加載
sudo chkconfig docker on

鏡像

1. 從倉(cāng)庫(kù)獲取鏡像

命令
docker pull ubuntu:12.04
上面命令相當(dāng)于
docker pull registry.hub.docker.com/ubuntu:12.04
docker pull nginx

#創(chuàng)建一個(gè)容器,讓其運(yùn)行bash應(yīng)用
docker run -t -i ubuntu:12.04 /bin/bash
docker run -it nginx /bin/bash
#列出本地鏡像
docker images
image.png
2. 管理本地主機(jī)上的鏡像
  • 修改已有的鏡像
  1. 先啟動(dòng)容器得到容器ID

[root@www docker]# docker run -it nginx /bin/bash
root@5f42bff05683:/#

5f42bff05683即為容器ID

  1. 安裝其他的應(yīng)用
  2. 提交更新后的副本

[root@www docker]# docker commit -m "ADD TEST" -a "ZZJ" 5f42bff05683 myrepository/nginx:20180101
sha256:e365f0423f76ee746c7226f4e164fd6f98094e636d9928290694279eb55564cf
myrepository/nginx:20180101 為:
倉(cāng)庫(kù)名:tag信息

image.png
  • 利用Dockerfile來(lái)創(chuàng)建鏡像
mkdir springboot_hello
touch Dockerfile

Dockerfile文件內(nèi)容

#This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
  • #表示注釋
  • FROM 表示基于哪個(gè)鏡像
  • MAINTAINER 是維護(hù)者的信息
  • RUN表示在創(chuàng)建中運(yùn)行
    編寫完Dockerfile后用docker build生成鏡像
    docker build -t="ouruser/sinatra:v2" .
  1. -t 標(biāo)記來(lái)添加tag
  2. "." 是Dockerfile所在的路徑,可以替換為其他
  3. ADD命令復(fù)制本地文件到鏡像
  4. EXPOSE命令向外部開(kāi)放端口
  5. 用CMD命令描述容器啟動(dòng)后運(yùn)行的程序
  6. 用docker tag 命令修改鏡像的標(biāo)簽

如:

# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
>\# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

docker tag 5db5f8471261 ouruser/sinatra:devel

鏡像不能超過(guò)127層

  • 導(dǎo)入本地鏡像
    cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
  • 上傳鏡像
    docker push ouruser/sinatra
  • 存出鏡像(保存鏡像到本地文件)
    sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
  • 載入鏡像(將本地保存出來(lái)的鏡像導(dǎo)入到鏡像庫(kù))
docker load --input ubuntu_14.04.tar
或者
docker load < ubuntu_14.04.tar
  • 移除本地鏡像
    docker rmi training/sinatra:[tag]
  • 移除容器
    docker rm ...
注: 移除鏡像之前要先移除該鏡像的所有容器
3. 鏡像的基本原理

Union FS

Docker容器

容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用, 以及它們的運(yùn)行態(tài)環(huán)境

  • 啟動(dòng)容器
  • 新建并啟動(dòng)容器

[root@www springboot_hello]# docker run -it docker.io/centos:latest /bin/echo "Hello World"

Docker run在后臺(tái)的標(biāo)準(zhǔn)操作有:

  • 檢查本地是否存在指定的鏡像, 不存在就從公有倉(cāng)庫(kù)下載
  • 利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器
  • 分配一個(gè)文件系統(tǒng), 并在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去
  • 從地址池配置一個(gè) ip 地址給容器
  • 執(zhí)行用戶指定的應(yīng)用程序
  • 執(zhí)行完畢后容器被終止
  • 啟動(dòng)已終止的容器

docker start

  • 守護(hù)態(tài)運(yùn)行

docker run -d docker.io/centos:latest /bin/bash -c "while true ;do echo hello world done;"
docker ps 查看容器信息
docker logs 查看容器的輸出信息

  • 停止容器

docker stop

  • 當(dāng)Docker容器中指定的應(yīng)用終結(jié)時(shí), 容器也自動(dòng)終止
    docker ps -a 可看到終止?fàn)顟B(tài)的容器
    docker restart 重啟一個(gè)容器

  • 進(jìn)入容器
  1. docker attach
    但是使用 attach 命令有時(shí)候并不方便。 當(dāng)多個(gè)窗口同時(shí) attach 到同一個(gè)容器的時(shí)候, 所有窗口都會(huì)同步顯示。 當(dāng)某個(gè)窗口因命令阻塞時(shí),其他窗口也無(wú)法執(zhí)行操作了。
  2. nsenter
    安裝命令如下:

$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin

獲取進(jìn)程的PID
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)

image.png

wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
https://github.com/yeasy/docker_practice

  • 導(dǎo)出容器快照

docker export 7691a814370e > ubuntu.tar

  • 導(dǎo)入容器快照

cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
docker import http://example.com/exampleimage.tgz example/imagerepo
注:用戶既可以使用 docker load 來(lái)導(dǎo)入鏡像存儲(chǔ)文件到本地鏡像庫(kù), 也可以使用 docker import 來(lái)導(dǎo)入一個(gè)容器快照到本地鏡像庫(kù)。 這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)) , 而鏡像存儲(chǔ)文件將保存完整記錄, 體積也要大。 此外, 從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息。

  • 刪除容器

docker rm -f ...

docker rm -f $(docker ps -a -q)
docker images|grep none|awk '{print $3 }'|xargs docker rmi

Docker倉(cāng)庫(kù)

倉(cāng)庫(kù)(Repository) 是集中存放鏡像的地方
對(duì)于倉(cāng)庫(kù)地址 dl.dockerpool.com/ubuntu 來(lái)說(shuō), dl.dockerpool.com 是注冊(cè)服務(wù)器地址, ubuntu 是倉(cāng)庫(kù)名

Docker Hub

  • 登錄
    可以通過(guò)執(zhí)行 docker login 命令來(lái)輸入用戶名、 密碼和郵箱來(lái)完成注冊(cè)和登錄。 注冊(cè)成功后, 本地用戶目錄的 .dockercfg 中將保存用戶的認(rèn)證信息
  • 基本操作
    用戶無(wú)需登錄即可通過(guò) docker search 命令來(lái)查找官方倉(cāng)庫(kù)中的鏡像, 并利用 docker pull 命令來(lái)將它下載到本地
    docker search centos

私有倉(cāng)庫(kù)

docker-registry 是官方提供的工具, 可以用于構(gòu)建私有的鏡像倉(cāng)庫(kù)。

  • 安裝運(yùn)行 docker-registry

本地安裝

yum install -y python-devel libevent-devel python-pip gcc xz-devel
python-pip install docker-registry
No package python-pip available. 解決方法
sudo yum -y install epel-release
sudo yum -y install python-pip
sudo yum clean all

解決上面問(wèn)題時(shí)又報(bào)錯(cuò)

Error: Package: python-pip-7.1.0-1.el6.noarch (epel)
Requires: python(abi) = 2.6
Installed: python-2.7.5-58.el7.x86_64 (@base)
python(abi) = 2.7
python(abi) = 2.7
Available: python34-3.4.5-4.el6.i686 (epel)
python(abi) = 3.4

所以安裝Python 2.6
CentOS 7 編譯安裝Python2.6.1
centos7 python多版本切換

  • 在私有倉(cāng)庫(kù)上傳、 下載、 搜索鏡像
  • docker tag 標(biāo)記一個(gè)鏡像

格式為 :
docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
如: docker tag ba58 192.168.7.26:5000/test

  • 使用 docker push 上傳標(biāo)記的鏡像

docker push 192.168.7.26:5000/test

  • 用 curl 查看倉(cāng)庫(kù)中的鏡像

curl http://192.168.7.26:5000/v1/search

  • 另外一臺(tái)機(jī)器去下載這個(gè)鏡像

docker pull 192.168.7.26:5000/test

  • 可以使用 這個(gè)腳本 批量上傳本地的鏡像到注冊(cè)服務(wù)器中, 默認(rèn)是本地注冊(cè)服務(wù)器 127.0.0.1:5000

wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push

#!/bin/sh

# This script will upload the given local images to a registry server ($registry is the default value).
# See: https://github.com/yeasy/docker_practice/blob/master/_local/push_images.sh
# Usage:  push_images image1 [image2...]
# Author: yeasy@github
# Create: 2014-09-23

#The registry server address where you want push the images into
registry=127.0.0.1:5000

### DO NOT MODIFY THE FOLLOWING PART, UNLESS YOU KNOW WHAT IT MEANS ###
echo_r () {
    [ $# -ne 1 ] && return 0
    echo -e "\033[31m$1\033[0m"
}
echo_g () {
    [ $# -ne 1 ] && return 0
    echo -e "\033[32m$1\033[0m"
}
echo_y () {
    [ $# -ne 1 ] && return 0
    echo -e "\033[33m$1\033[0m"
}
echo_b () {
    [ $# -ne 1 ] && return 0
    echo -e "\033[34m$1\033[0m"
}

usage() {
    sudo docker images
    echo "Usage: $0 registry1:tag1 [registry2:tag2...]"
}

[ $# -lt 1 ] && usage && exit

echo_b "The registry server is $registry"


for image in "$@"
do
    echo_b "Uploading $image..."
    sudo docker tag $image $registry/$image
    sudo docker push $registry/$image
    sudo docker rmi $registry/$image
    echo_g "Done"
done

摘自:https://github.com/yeasy/docker_practice/blob/docker-legacy/_local/push_images.sh

Docker 數(shù)據(jù)管理

  • 數(shù)據(jù)卷(Data volumes)

數(shù)據(jù)卷可以在容器之間共享和重用
對(duì)數(shù)據(jù)卷的修改會(huì)立馬生效
對(duì)數(shù)據(jù)卷的更新, 不會(huì)影響鏡像
卷會(huì)一直存在, 直到?jīng)]有容器使用

數(shù)據(jù)卷的使用, 類似于 Linux 下對(duì)目錄或文件進(jìn)行 mount

  • 創(chuàng)建一個(gè)數(shù)據(jù)卷

docker run -d -P --name web -v /webapp training/webapp python app.py

注意:也可以在 Dockerfile 中使用 VOLUME 來(lái)添加一個(gè)或者多個(gè)新的卷到由該鏡像創(chuàng)建的任意容器。

  • 掛載一個(gè)主機(jī)目錄作為數(shù)據(jù)卷

docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py

注意:Dockerfile 中不支持這種用法, 這是因?yàn)?Dockerfile 是為了移植和分享用的。 然而, 不同操作系統(tǒng)
的路徑格式不一樣, 所以目前還不能支持。

  • 掛載一個(gè)本地主機(jī)文件作為數(shù)據(jù)卷

docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
這樣就可以記錄在容器輸入過(guò)的命令了。

  • 數(shù)據(jù)卷容器(Data volume containers)

curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-uname -s-`u
$ sudo chmod a+x /usr/local/bin/docker-compose

Docker鏡像和倉(cāng)庫(kù)

-查看docker鏡像 docker images

image.png

  • 搜索鏡像 docker search puppet
    image.png

倉(cāng)庫(kù)Docker Registry

  • 利用鏡像直接搭建倉(cāng)庫(kù)
docker run -p 5000:5000 registry:2 
[利用阿里云 OSS 搭建私有 Docker 倉(cāng)庫(kù)](http://morning.work/page/2016-01/deploying-your-own-private-docker-registry.html)
  • 構(gòu)建鏡像
  • 方式1 commit方式
    `docker commit [容器ID] [目標(biāo)倉(cāng)庫(kù)]/[鏡像名]:[tag] -m"描述" -a"作者"

  • 獲取容器ID docker ps -l -q

    image.png

  • 方法2 Dockerfile方式

[root@registry docker_srm_portal]# more Dockerfile 
# centos image
FROM centos
MAINTAINER xxx@xxx.com
#copy jdk and tomcat into image
ADD  ./tomcat8.tar.gz /opt/
ADD ./jdk1.8.tar.gz /opt/

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

#set environment variable
ENV JAVA_HOME /opt/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

RUN chmod -R +x /opt/tomcat8/bin

# copy web
COPY ./ROOT.war /opt/tomcat8/webapps/

VOLUME ["/opt/tomcat8/logs"]

EXPOSE 8080

#define entry point which will be run first when the container starts up
ENTRYPOINT /opt/tomcat8/bin/startup.sh && tail -f /opt/tomcat8/logs/catalina.out

exec命令方式執(zhí)行run

RUN ["apt-get"," install","-y","nginx"]
  • 刷新
ENV REFRESHED_AT 2018-01-01
RUN apt-get -qq update #刷新APT包的緩存
RUN yum -q makecache
  • 構(gòu)建
docker build --no-cache -t="[倉(cāng)庫(kù)]/[鏡像名]:[tag]" .
docker build --no-cache -t="[倉(cāng)庫(kù)]/[鏡像名]:[tag]" . -f file_path
  • docker history


    image.png
  • 查看端口
    docker ps -l
    docker port d96f3be34108

    image.png

  • 啟動(dòng)容器

docker run -d -p 127.0.0.1:80:80 --name web_demo [倉(cāng)庫(kù)]/[鏡像名]:[TAG] nginx -g "daemon off"

CMD指令用于指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令。CMD可以在容器啟動(dòng)時(shí)被替換。當(dāng)Dockerfile存在兩個(gè)或多個(gè)CMD指令時(shí)最有最后一個(gè)CMD指令生效。
指定要運(yùn)行的特定命令:docker run –it centos /bin/sh
添加CMD指令:
CMD[“/bin/true”]
給CMD指令傳遞參數(shù):
CMD[“/bin/bash”,”-l”]
如有多個(gè)命令或多個(gè)進(jìn)程可以使用CMD /bin/bash –l && /bin/true 或考慮類型Supervisor這樣的服務(wù)管理工具。
CMD ["/bin/bash","-l"]
CMD ["/bin/bash"]

  • ENTRYPOINT命令

ENTRYPOINT指令與CMD指令非常類似,很容易和CMD指令弄混。CMD指令可以在docker run 命令行中覆蓋CMD指令,有時(shí)候,我們希望容器會(huì)按照我們想象的那樣去工作,這時(shí)候CMD就不太適合了。而ENTRYPOINT指令提供的命令不容易在啟動(dòng)時(shí)被覆蓋。實(shí)際上,docker run 命令行中指定的任何參數(shù)都會(huì)被當(dāng)作參數(shù)再次傳遞給ENTRYPOINT指令中指定的命令
添加ENTRYPOINT指令:
ENTRYPOINT[“/usr/sbin/nginx”]
給ENTRYPOINT傳遞參數(shù):
ENTRYPOINT[“/usr/sbin/nginx”,”-g”,”daemon off;”]
與CMD組合使用:
ENTRYPOINT[“/usr/sbin/nginx”]
CMD[“-h”]
注意:與CMD指令一樣,ENTRYPOINT也是以數(shù)組的方式來(lái)運(yùn)行,也可以通過(guò)增加 /bin/sh –c 來(lái)直接運(yùn)行命令。
如果用戶確實(shí)需要,用戶也可以在運(yùn)行時(shí)通過(guò)docker run 的 –entrypoint 標(biāo)志來(lái)覆蓋 ENTRYPOINT指令。

ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off"]
CMD ["-h"]

可以用docker run 的--entrypoint 標(biāo)志覆蓋ENTRYPOINT命令
CMD和ENTRYPOINT 的主要區(qū)別是:ENTRYPOINT 提供的命令不容易在啟動(dòng)容器時(shí)被覆蓋

  • WORKDIR

切換工作目錄,ENTRYPOINTCMD在指定的工作目錄下執(zhí)行

WORKDIR /opt/
RUN bundle install
WORKDIR /webapp
ENTRYPOINT [ "rackup" ]

可以覆蓋:如docker run -it -w /var/log ubuntu pwd

  • ENV

設(shè)置環(huán)境變量

#一個(gè)ENV定義多個(gè)環(huán)境變量
ENV RVM_PATH=/home/rvm RVM_ARCHFLAGES="-arch i386"
ENV TARGET_DIR /opt/app
#可以引用已經(jīng)定義的環(huán)境變量
WORKDIR $TARGET_DIR 
#–e 標(biāo)志來(lái)傳遞環(huán)境變量
docker run –it –e“WEB_PORT=8080”ubuntu env

運(yùn)行時(shí)也可指定,只在運(yùn)行時(shí)有效,如:docker run -it -e "WEB_PORT=8080" ubuntu env

  • USER
#不指定默認(rèn)為root
USER nginx:group

docker run 中可以用 -u 指定

  • VOLUME

VOLUME指令用來(lái)向基于鏡像創(chuàng)建的容器添加卷。一個(gè)卷可以存在于一個(gè)或者多個(gè)容器的特定的目錄,這個(gè)目錄可以繞過(guò)聯(lián)合文件系統(tǒng),并提供如下共享數(shù)據(jù)或者對(duì)數(shù)據(jù)進(jìn)行持久化功能。

1. 卷可以在容器間共享和重用。
2. 一個(gè)容器可以不是必須和其他容器共享卷。
3. 對(duì)卷的修改時(shí)立即生效的。
4. 對(duì)卷的修改不會(huì)對(duì)更新鏡像產(chǎn)生影響。
5. 卷會(huì)一直存在直到?jīng)]有任何容器在使用它。
    添加VOLUME指令:
       VOLUME[“/opt/tomcat7/logs”]
   添加VOLUME指令指定多個(gè)卷
        VOLUME[“/opt/tomcat7/logs”,”/data”]
VOLUME ["/opt/project"]
#指定多個(gè)卷
VOLUME ["/opt/project","data"]

docker cp 和 VOLUME 類似

#鏡像里復(fù)制出來(lái)
docker cp cas_sso_1:/opt/tomcat7/webapps/cas.war .
#宿主復(fù)制到容器
docker cp 1.txt cas_sso_1:/opt/tomcat7/webapps
  • ADD

將構(gòu)建目錄下的文件和目錄復(fù)制到鏡像中

ADD software.lic /opt/app/software.lic
#以目的的/判斷源是目錄還是文件
ADD /opt/app /var/local/app/ #以/結(jié)尾為目錄
#使用URL格式
ADD http://www.baidu.com/test.txt /root/test.txt
#自動(dòng)解壓gzip,bzip2,gz的包
ADD test.tar.gz /var/www/app

注意
為了讓鏡像盡量小,最好不要使用ADD指令從遠(yuǎn)程 URL 獲取包,而是使用curl和wget。這樣你可以在文件提取完之后刪掉不再需要的文件,可以避免在鏡像中額外添加一層。(譯者注:ADD指令不能和其他指令合并,所以前者ADD指令會(huì)單獨(dú)產(chǎn)生一層鏡像。而后者可以將獲取、提取、安裝、刪除合并到同一條RUN指令中,只有一層鏡像。)

  • COPY
#只復(fù)制Dockerfile同目錄的,不解壓和提取,容器里面是絕對(duì)路徑
COPY config/ /etc/app/
#拷貝目錄:
COPY conf.d/  /etc/apache2/ 
#拷貝文件
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
  • LABEL

添加元數(shù)據(jù),盡量所有的元數(shù)據(jù)都放到一條LABEL中,替代MAINTAINER

LABEL location="New York" type="Data Center"
LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

查看元數(shù)據(jù)`docker inspect [倉(cāng)庫(kù)名]/[鏡像名]

  • STOPSIGNAL

STOPSIGNAL 9
STOPSIGNAL SIGKILL

ARG指令用來(lái)定義可以在docker build 命令運(yùn)行時(shí)傳遞給構(gòu)建運(yùn)行時(shí)變量的指令,在構(gòu)建時(shí)需要使用 –build-arg 標(biāo)志即可,用戶只能在構(gòu)建時(shí)指定在Dockerfile文件中定義過(guò)的參數(shù)。在Dockerfile定義這些參數(shù)后如未設(shè)置默認(rèn)值,且在構(gòu)建時(shí)未傳入定義變量的值時(shí),構(gòu)建將失敗。

ARG build
ARG webapp_user=user
docker build --build-arg build=1234 -t [倉(cāng)庫(kù)名]/[鏡像名] .
  • ONBUILD
ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make
  • 實(shí)例
[root@registry docker_srm_portal]# ll
total 245312
-rw-r--r-- 1 root root       193 Dec 26 01:45 docker-compose.yml
-rw-r--r-- 1 root root       565 Dec 26 01:49 Dockerfile
-rw-r--r-- 1 root root 185525916 Dec 19 10:32 jdk1.8.tar.gz
-rw-r--r-- 1 root root  57603854 Jan 15 10:56 ROOT.war
-rw-r--r-- 1 root root   8056699 Dec 27 18:48 tomcat8.tar.gz
[root@registry docker_srm_portal]# more Dockerfile 
# centos image
FROM centos
MAINTAINER xxx@xxx.com
#copy jdk and tomcat into image
ADD  ./tomcat8.tar.gz /opt/
ADD ./jdk1.8.tar.gz /opt/

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

#set environment variable
ENV JAVA_HOME /opt/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

RUN chmod -R +x /opt/tomcat8

# copy web
COPY ./ROOT.war /opt/tomcat8/webapps/

VOLUME ["/opt/tomcat8/logs"]

EXPOSE 8080

#define entry point which will be run first when the container starts up
ENTRYPOINT /opt/tomcat8/bin/startup.sh && tail -f /opt/tomcat8/logs/catalina.out
[root@registry docker_srm_portal]# more docker-compose.yml 
version: '2'
services:
  srm_portal:  
    image: 10.100.60.88:8080/srm_portal:1.0
    ports: 
      - "8080:8080"
    volumes: 
      - "./logs:/opt/tomcat8/logs"
      - "./upload:/usr/upload"
  • 查看

docker inspect 容器ID

  • 刪除鏡像

docker rmi [倉(cāng)庫(kù)名]/[鏡像名]
docker rmi `docker images -a -q`

docker images [倉(cāng)庫(kù)名]/[鏡像名]
#使用新的Registry為鏡像打標(biāo)簽
docker tag 鏡像ID  [主機(jī)名]:端口號(hào)/[倉(cāng)庫(kù)名]/[鏡像名]
#推送到新的Registry
docker push [主機(jī)名]:端口號(hào)/[倉(cāng)庫(kù)名]/[鏡像名]

資源鏈接

Docker 主站點(diǎn): https://www.docker.io
Docker 注冊(cè)中心API: http://docs.docker.com/reference/api/registry_api/
Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/
Docker 遠(yuǎn)端應(yīng)用API: http://docs.docker.com/reference/api/docker_remote_api/
Dockerfile 參考:https://docs.docker.com/reference/builder/
Dockerfile 最佳實(shí)踐:https://docs.docker.com/articles/dockerfile_best-practices/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,770評(píng)論 0 120
  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,873評(píng)論 15 147
  • 0. 前言 docker是什么?docker是用GO語(yǔ)言開(kāi)發(fā)的應(yīng)用容器引擎,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)???..
    sessionboy閱讀 4,023評(píng)論 2 49
  • 你在我心最柔軟的地方留下印記,而你卻不知道。 我對(duì)你的感覺(jué)從未消失,甚至越來(lái)越強(qiáng)烈。 當(dāng)我走過(guò)街道時(shí),看見(jiàn)那些...
    茶玉無(wú)雙閱讀 291評(píng)論 0 1
  • 地點(diǎn):浙江湖州太湖邊月亮酒店 器材:大疆精靈3 無(wú)人機(jī)航拍 參數(shù):光圈F2.8 快門3秒 ISO100 版權(quán): K...
    凱德印象閱讀 594評(píng)論 0 0

友情鏈接更多精彩內(nèi)容