docker笔记
容器的特点:
- 通过image创建
- 在image layer之上建立一个container layer, 这个容器层可以read/write操作
- 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的镜像