跳到主內容

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

 

*建立映像檔
# 於當前目錄,按Dockerfile.test中的指令,建立test:v1 ({name:tag})的映像檔
docker build . -f Dockrfile.test -t test:v1
*拉取與推送映像檔
# 使用docker hub 下載image ({name:tag})
docker pull node:alpine
# 使用quay.io 下載image 
docker pull quay.io/bitnami/tomcat
# 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
#########################################################
#  可與許http鏡像 "insecure-registries" : ["10.60.78.79"],
#  鏡像站 "registry-mirrors": ["http://hub-mirror.c.163.com"]

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
#########################################################
# 使文件生效
sudo systemctl daemon-reload
# 重啟docker
sudo service docker restart
使用proxy 抓取鏡像檔

*ubuntu

# 編輯設定檔
vim /etc/default/docker

##檔案內容
export http_proxy="http://192.168.33.10:3128/"
export https_proxy="http://192.168.33.10:3128/"
##

# proxy 如果有帳密驗證
export http_proxy="https://username:password@192.168.33.10:3128/"

# 重啟docker 
systemctl restart docker

*centos

vim /etc/systemd/system/docker.service.d/http-proxy.conf 

###################################################################################
[Service]
Environment="HTTP_PROXY=http://192.168.1.1:3128/"
Environment="HTTPS_PROXY=http://192.168.1.1:3128/"
#如果要排除不走
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"

###################################################################################

#重讀設定
systemctl daemon-reload

#重啟docker
systemctl restart docker

查看image
# 取得id
[root@localhost ~]# docker image ls

REPOSITORY   TAG            IMAGE ID       CREATED        SIZE
tomcat       latest         9f35737a8466   30 hours ago   680MB
busybox      latest         beae173ccac6   3 weeks ago    1.24MB
openjdk      8-jre-alpine   f7a292bbb70c   2 years ago    84.9MB
[root@localhost ~]# docker image inspect f7a292bbb70c
[
    {
        "Id": "sha256:f7a292bbb70c4ce57f7704cc03eb09e299de9da19013b084f138154421918cb4",
        "RepoTags": [
            "openjdk:8-jre-alpine"
        ],
        "RepoDigests": [
            "openjdk@sha256:f362b165b870ef129cbe730
.......

# 重要訊息
 "Id": "sha256:f7a292bbb70c4ce57f7704cc03eb09e299de9da19013b084f138154421918cb4",
        "RepoTags": [
            "openjdk:8-jre-alpine"
        ],


"Architecture": "amd64",
 "Os": "linux",
刪除 image
# 查詢要刪除imge id
[root@localhost ~]# docker image ls
REPOSITORY   TAG            IMAGE ID       CREATED        SIZE
tomcat       latest         9f35737a8466   30 hours ago   680MB
busybox      latest         beae173ccac6   3 weeks ago    1.24MB
openjdk      8-jre-alpine   f7a292bbb70c   2 years ago    84.9MB
# 刪除 image
[root@localhost ~]# docker image rm beae173ccac6
Untagged: busybox:latest
Untagged: busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Deleted: sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
Deleted: sha256:01fd6df81c8ec7dd24bbbd72342671f41813f992999a3471b9d9cbc44ad88374

# 刪除名字跟nginx 有關的imge (-f 強制)
[root@localhost ~]# docker images | grep nginx | awk '{print $3}' | xargs docker rmi
[root@localhost ~]# docker images | grep nginx | awk '{print $3}' | xargs docker rmi -f

# 刪除沒有名字的image (-f 強制)
[root@localhost ~]# docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
[root@localhost ~]# docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi -f
image 匯入匯出
# 查看 image
[root@localhost ~]# docker image ls
REPOSITORY   TAG            IMAGE ID       CREATED        SIZE
tomcat       latest         9f35737a8466   30 hours ago   680MB
busybox      latest         beae173ccac6   3 weeks ago    1.24MB
openjdk      8-jre-alpine   f7a292bbb70c   2 years ago    84.9MB

# 匯出 image
# docker image save {name}:{tag} -o {匯出檔名}
[root@localhost ~]# docker image save openjdk:8-jre-alpine -o openjdk:8-jre-alpine.image
# 查看是否匯出
[root@localhost ~]# ls openjdk\:8-jre-alpine.image 
openjdk:8-jre-alpine.image
# image 匯入
# docker image load -i {image file}
[root@localhost ~]# docker image load -i ./openjdk\:8-jre-alpine.image 
f1b5933fe4b5: Loading layer [==================================================>]  5.796MB/5.796MB
9b9b7f3d56a0: Loading layer [==================================================>]  3.584kB/3.584kB
edd61588d126: Loading layer [==================================================>]  80.28MB/80.28MB
Loaded image: openjdk:8-jre-alpine

push image to docker hub

# 建立上傳image
#docker image tag nginx {docker hub id}/{name}:{tag}
docker image tag nginx treemanou/my_nginx:v2
#docker image push {docker hub id}/{name}:{tag}
docker image push treemanou/my_nginx:v2

commit 建立 image

# 找一個conatiner
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
e09bb406dcef   busybox   "sh"      53 seconds ago   Exited (0) 18 seconds ago             hardcore_bartik
# 利用此container建立 image
# docker commit {container id} {name}:{tag}
$ docker commit e09 treemanou/my_busybox:v3
sha256:42bc77669110af56336ec10afdbd7f92fa371f02ecccbda1e0bbb1bbc00f3cf6

Docker File


Docker File 官方說明

Dockerfile reference | Docker Documentation


*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


常用image

busybox

  • 提供輕量簡單的shell 的 linux 容器
containous/whoami
  • 提供返回ip hostname 服務
vagrant@swarm-manager:~$ curl 192.168.200.10:8080
Hostname: fdf7c1354507
IP: 127.0.0.1
IP: 10.0.0.7
IP: 172.18.0.3
IP: 10.0.1.14
RemoteAddr: 10.0.0.2:36828
GET / HTTP/1.1
Host: 192.168.200.10:8080
User-Agent: curl/7.68.0
Accept: */*