跳到主內容

Docker Image 相關

鏡像的獲取

  • pull from registry (online) 從registry拉取

    • public(公有)

    • private(私有)

  • build from Dockerfile (online) 從Dockerfile構建

  • load from file (offline) 文件導入 (離線)

官方image:
https://hub.docker.com/search?type=image&image_filter=official


常用 public image server

Docker Hub Container Image Library | App Containerization

 

*建立映像檔

# 於當前目錄,按Dockerfile.test中的指令,建立test:v1 ({name:tag})的映像檔
docker build . -f Dockrfile.test -t test:v1

*拉取與推送映像檔

# docker hub 下載image ({name:tag})
docker pull node:alpine
# node:alpine 重新命名標籤 username/nodea:alpine
docker tag node:alpine username/nodea:alpine
# 推送至私人倉庫
docker push username/node:alpine

使用私有registry

# 修改鏡像registry
sudo vim /etc/docker/daemon.json
#########################################################
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
#########################################################
# 使文件生效
sudo systemctl daemon-reload
# 重啟docker
sudo service docker restart

 

*ENV 環境變數

ENV ANT_HOME /opt/ant

*ARG傳入參數

FROM alpine
ARG NODE_ARG
ENV NODE_ENV="${NODE_ARG:-development}"
RUN echo "ARG=${NODE_ARG}, ENV=${NODE_ENV}"
CMD ehco "ARG=${NODE_ARG}, ENV=${NODE_ENV}"
# 傳入NODE_ARG
# DOCKER_BUILDKIT=0
DOCKER_BUILDKIT=0 docker build --build-arg NODE_ARG=staging .

*工作目錄 WORKDIR

# /  下
RUN echo "say hi" > hi.txt
WORKDIR /app
#  /app 下
RUN echo "hello" > world.txt

*指定用戶USER (不指定舊識)

# 新增 group與user
RUN groupadd -r redis && useradd -r -g redis redis
# 指定當前user為redis
USER redis

# 以redis的身份執行reidis-server
RUN ["redis-server"]

*Health Check

FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1

 

FROM registry.test.com.tw/test/centos:openjdk8_tomcat8.5

ENV CATALINA_HOME /opt/tomcat
ENV SERVICE_HOME /usr/AP/fubon
ENV ANT_HOME /opt/ant
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk
ENV PATH="${PATH}:${ANT_HOME}/bin:${CATALINA_HOME}/bin"
ENV AWS_HOME="/root/aws"

RUN wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.7-bin.tar.gz \
  && tar -zxvf apache-ant-1.10.7-bin.tar.gz \
  && rm apache-ant-1.10.7-bin.tar.gz \
  && mv apache-ant* ${ANT_HOME} \
  && yum install -y python3 \
  && pip3 install awscli --upgrade --user \
  && ln -s  /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/ /usr/lib/jvm/java-1.8.0-openjdk.x86_64 \
  && yum install -y httpd php php-gd 
  
COPY server.xml ${CATALINA_HOME}/conf/

COPY my_entrypoint.sh /my_entrypoint.sh
RUN chmod -v +x /my_entrypoint.sh

COPY --chown=user:group file* /app/

COPY server_builder.sh ${SERVICE_HOME}/

#Set Alias
RUN echo "alias cdcm='cd /usr/AP/test/cm'" >> ~/.bashrc \
 && echo "alias restartTomcat='cd /opt/tomcat/bin; ./shutdown.sh; /bin/sleep 3; ps -ef | grep '\''org.apache.catalina.startup.Bootstrap start'\'' | grep -v grep | awk '\''{print $2}'\'' | xargs kill; ./startup.sh'" >> ~/.bashrc \
 && echo "alias cmant='cd /usr/AP/test/cm/src; ant; restartTomcat'"  >> ~/.bashrc \
 
EXPOSE 8080

CMD ["-D","FOREGROUND"]

# 預設目錄
WORKDIR /usr/AP/test/ 

#  一定會執行
ENTRYPOINT ["/my_entrypoint.sh"]

* 複寫CMD

docker run --rm apache:v1 -v

多階段建置

# 建置環境
FROM alpine as build
RUN echo "hello" > mytest

#  執行環境
FROM alpine
COPY --from=build /mytest .
RUN cat /mytest 

Distroless Dock image  => 精簡image