docker笔记

容器的特点:

  1. 通过image创建
  2. 在image layer之上建立一个container layer, 这个容器层可以read/write操作
  3. image负责app的存储和分发, container负责运行app

image和container的关系:

  类->image,对象->container, container相当于image的实例对象,可以对container进行创建,运行,停止,删除

docker基本命令:

  ①查看系统有哪些image

    docker images

    docker image ls

  ②删除镜像

    docker rmi image_name

  ③创建/启动容器(-d 后台运行)

    docker create [contrainer_name]

    docker run (-d) [contrainer_name]

    eg: docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

  docker run和docker create的区别:create只是创建容器,不启动容器,而docker run是创建并且启动容器,如果用docker create,还需要用docker start启动容器

  ④列举容器list

    docker container ls  #查看当前运行的container

    docker container ls -a   #查看全部container

  ⑤交互式容器

    docker run -it [container_name]   #exit退出

    eg: docker exec -it mysql bash

  ⑥停止运行中的容器

    docker stop/pause/kill container_id

  ⑦删除容器

    docker rm [container_id]  #删除前必须先stop

    docker rm $(docker ps -aq)  #一次性删除所有已经exit的容器

  ⑧查看所有容器的状态

    docker ps -a

  ⑨构建dockerfile

    docker build

      忽略文件:.dockerignore

      指定文件:docker build -f

      添加标签:docker build -t

      不使用缓存:docker build --no-cache

      构建时变量:docker build -build

    docker commit [container_name] [new_image_name]:tag

  区别:docker commit一般用做从一个运行状态的容器来创建一个新的镜像,定制镜像应该使用dockerfile来完成,默认commit镜像,对外不可解释,不方便排查问题,可维护性差

  ⑩拉取/推送/搜索镜像

    docker pull images_name

    docker push images_name #需登录docker login然后docker push

    docker search images_name

 

dockerfile

dockerfile是有一系列指令和参数构成的脚本,一个dockerfile里面包含了构建整个镜像的完整指令,通过docker build 执行dockerfile中的一系列指令自动构建镜像。

常用指令:

  FROM:基础镜像,FROM命令必须是dockerfile的首个命令,定义从哪一层镜像开始

  LABEL:为镜像生成元数据标签信息,用来表明这个Image的作者,版本,描述等信息,当然LABEL也可以不写,这个关键字不是必须的

  USER:指定运行容器时的用户名或UID,后续RUN也会使用指定用户

  RUN:RUN命令时dockerfile执行命令的核心部分,它接受命令作为参数并用于创建镜像,每条RUN命令子啊当前基础镜像上执行,并且会提交一个新镜像层 

    (RUN需要注意的一点,每次运行RUN一次都会产生新的layer(层), 我们知道一个image是有很多层的,所以,最佳的实践是一个RUN 里面写多个命令,用&&连接多个命令,为了可读性和美观,使用换行符,多行显示RUN里面要执行的命令。)

  WORKDIR:设置CMD指明的命令的运行目录,为后续的RUN,CMD,ENTRYPOINT,ADD指令配置工作目录(写工作目录的时候尽量写绝对路径,不要写相对目录)

  ENV:容器启动的环境变量

  ARG:构建环境的环境变量

  COPY,ADD: 作用都是把本地的文件添加到Docker image里面。两者唯一的区别是,ADD的功能更强大一些,ADD会拷贝文件并且解压文件,COPY只能拷贝文件。

  CMD:容器运行时执行的默认命令

  ENTRYPOINT:指定容器的入口

  HEALTHCHECK:容器健康状态检查

#基于nginx:1.17.9镜像构建
FROM nginx:1.17.9

#指定信息
LABEL maintainer="abc@qq.com"

#设置环境变量
ENV NGINX_VERSION 1.17.9
ARG work_pwd=/data/html/

#切换root用户
USER root

#执行命令,安装curl软件,设置软链接把nginx服务的日志显示到终端
RUN apt-get -yq update && apt-get install -y curl && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dec/stderr /var/log/nginx/error.log

#挂载卷
VOLUME ["/data"]

#设置工作目录
WORKDIR $work_pwd

#复制index.html 文件到 WORKDIR 目录下
COPY index.html .

#映射80端口
EXPOSE 80

#此处 CMD 作为 ENTRYPOINT 的参数
CMD ["nginx","-g","daemon off;"]
#CMD ["-g","daemon off;"]
#CMD nginx -g daemon off
#设置容器启动的命令
#ENTRYPOINT ["nginx","-g","daemon off;"]

STOPSIGNAL STGRTMAX

#检查容器健康,通过访问Nignx服务80端口,来判断容器服务是否运行正常
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1

发布一个镜像到私有docker仓库

  0. 安装docker,并启动docker服务

  1. 拉取docker registry镜像

    docker pull registry

  2. 启动registry

    docker run -d -p 5000:5000 --restart always --name registry registry:2

    #第一个5000是这个虚拟机本身的端口,第二个是5000是这个registry容器里的端口是5000.

  3. 测试registry这台机器的5000端口是否可用

    telnet  IP 5000

  4. 发布镜像到私有registry

    docker build -t IP:5000/hello-docker .

    docker push IP:5000/hello-docker

  5. 验证发布是否成功

  浏览器访问

      IP:5000/v2/hello-docker/tags/list #发送请求

      IP:5000/v2/_catalog  #查询全部pushed的镜像

  

      

posted @ 2020-09-07 17:03  lagjaflgjfl  阅读(112)  评论(0编辑  收藏  举报