#打包镜像   (两种写法)

docker save -o nginx.tar nginx:1.21.5

docker save nginx1.21.5 > nginx.tar

#上传镜像

docker load -i nginx.tar 

docker load < nginx.tar

#简单启动run一下测试打包是否正常,docker是否可用

docker run -d -p 82:80 nginx:1.21.5

#常见启动run时使用的参数

--name=

-v    挂载    没有/就是卷挂载可以docker volume ls查到,有就是普通文件挂载

-d    后台启动

-p    指定端口映射

--restart=always

#进入容器内部

docker exec -it id /bin/bash

#想要修改里面容器里面的文件就提前挂载出来在外面修改

#部署私有镜像仓库

docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restart=always --name=registry registry:latest

#删除容器

#写错名了删个容器

docker rm regietry

#删镜像

docker rmi registry:latest

#查看容器进程

docker top name

#上传镜像到仓库

#先打标签

docker tag nginx:1.21.5 127.0.0.1:5000/nginx:latest

#再上传

docker push 127.0.0.1:5000/nginx:latest

#查看是否上传成功

curl 127.0.0.1:5000/v2/_catalog

#docker常见命令

docker logs -f

docker images -q                 #获取镜像id

docker ps -q

docker ps -a

docker inspect

docker exec

dockers history                  可以看到镜像构建的过程

docker stats                       查看容器状态

docker volume ls               查看数据卷

#不像进容器内部只是执行一些查看命令(比如查看容器top)

docker exec -it name top

#查看容器镜像的占用信息

docker system df

#docker数据卷挂载

#匿名挂载(其实也是可以看到挂载的内容的inspect可以看到实际路径在哪)

docker run --rm -v /usr/www/html  nginx   (匿名卷这个停止容器时卷也会删掉)

#具名挂载

docker run --rm -v nginx:/usr/www/html  nginx   (具名的停止并不会删掉)

但docker rm -f 也是会删除的

#bind mount就是直接指定路径的挂载

docker rm也不会删除,并且会直接覆盖容器内被挂载的内容

#限制容器资源

#主要考虑cpu和内存
#限制容器最大内存

docker run -d -m 8m nginx

docker stats nginx   (查看是否真是限制8m)

#限制cpu数

docker run -d --cpus 1 nginx

#docker网络模式

#bridge        桥接

#host

#none

拥有自己的网络空间,完全与其他隔离,安全性高,无法通过网络模式访问到

#docker自定义网络

驱动是桥接模式,网段是192.168.133.0,网关是192.168.133.1

#容器通信

1.一般容器内通信是通过容器名称通信而不是ip

2.而要通过容器名可以是自定义网络时指定都在同一个

(docker network create netwokname)所创建的网络

3.如果是要使用默认的docker0的需要两个容器创建时用--link 对方的容器名

4两个不同网络的如何通信(connect)

相当于多加了了一块网卡,在原网络的基础上嵌套了一个目标连接的网络

(docker network connect net1 net2)

#查看启动命令runlike

#先安装python环境

yum install python3 python3-pip -y

pip3 install runlike

echo 'export PATH=$PATH:/usr/local/bin' >> /etc/profile

source /etc/profile

#查看nginx容器启动时的容器参数

runlike nginx

#dockerfile——(解决镜像的一些构建问题)

执行命令

docker build 路径或url

# -f 参数可以指定哪个文件是dockerfile文件不用文件名是Dockerfile,后面都要跟上dockerfile所在目录路径

docker build -f /dockerfile-dir/test /dockerfile-dir

docker build -f /dockerfile-dir/test .

# -t 参数是构建镜像时给标签命名和版本,

docker build . -t centos:v1

#dockerfile内容

#dockerfile书写例子

#容器的基础镜像

ARG jdk=11
FROM openjdk:$jdk

#通过arg传参,不填就用默认的
#lable对镜像的一些描述信息

LABLE version=1.0.0

#user,指定只有执行命令的用户

USER workuser

#ENV设置环境变量

ENV JAVA_ENV dev
ENV APP_NAME test

#一次性定义多个也可以,用key=value并空格隔开

ENV JAVA_ENV=dev APP_NAME=test

#RUN执行一些shell命令
RUN mkdir -p /www/index

#ADD 复制文件并解压一些文件左src 右dest(还可以url直接下载)

ADD /www/html /etc/nginx/html   

#设置容器内的工作目录(如果目录不存在会创建)

WORKDIR /app

#expose暴露端口,实际这个还不能通过宿主机访问,要想访问得要run的时候-p 80:80,加个tcp并没有限制作用只是一个描述,其实udp也可以通信

expose 80

expose 8080/tcp 

#CMD,ENTRYPOINT容器启动时执行的命令(区别同时执行多个cmd会被覆盖只取最后一个,entrypoint不会)

CMD ["ping qq.com"]
ENTRYPOINT ["java","-jar","xxxx.jar"]

#HEALTHCHECK健康检查

FROM                                        基于某个基础镜像开始构建

RUN                                           构建镜像时可以执行的命令

#RUN 两种写法,一种直接shell命令  一种用json格式["yum","install","-y","nginx"],用shell就是用子进程可以基础前面设置的环境变量,而json会新开一个主进程之前的环境变量就失效了,推荐用shell

#内有乾坤这个run,如果重复执行时会判断这个步骤也没有变如果变了就会执行,没变就会利用缓存(use cache),不仅是命令变,步骤变也一样相同命令原本是step2,变成3了也会重新执行,是一旦哪一步开始变化后面的内容都会重新执行即使步骤和命令没变(所以要新增run内容最好在最后加)

CMD      ENTRYPOINT

#这是生产镜像最标准的写法:ENTRYPOINT 定程序,CMD 给默认参数。

#cmd会被参数覆盖,entrypoint不会

RUN = 做蛋糕的时候加面粉、奶油、水果,烤好就固定了

ENTRYPOINT = 蛋糕的主胚子,一直是它

CMD = 默认配的叉子,你想换勺子也可

                        

LABEL            对镜像的一些描述

EXPOSE         对外暴露端口,只暴露不映射

ENV                 环境变量

ARG                 也是环境变量可以在构建时动态传参但也只有在构建时起作用build,

例: docker build . --build-arg=BUILD_VERSION=3.0

ADD               #add,copy都可以传文件,但add可以自动解压,但有时会解压失败

COPY            #所以更通常用copy然后用run解压

VOLUME /data   

#就是把容器里的/data直接创建卷并挂载过去(默认在/var/lib/docker/volume/)

不能实现目录挂载,docker-compose.yml才可以

USER            #指定某个用户执行run cmd ,entrypoint

WORKDIR     #指定工作目录

onbuild         再执行基础镜像前需要执行的操作

healthcheck   健康检查

#基于sprintboot构建镜像

#部署war包

#基于centos源码编译安装nginx的dockerfile

#docker-compose.yml——(镜像的使用)

#docker-compose应用

docker compose config         检查语法

docker compose up -d

#有时第一次构建错了,只改了文件就再次构建会有缓存任然拿旧镜像搞的一直错

可以加--build

#容器停止,down不要轻易用不然有一些数据卷会重启启动数据丢失

docker compose pause

#flask-web简单部署

version: "3.6"                                  #必须
services:                                         #必须
  flask:                                            #服务名自己取
    build: .                                        #dockerfile路径
    ports:
      - 5000:5000
    container_name: flask               #镜像名
    networks:                                   #网络
      - web
  redis:
    image: redis                                #不用dockerfile就用image
    container_name: redis2
    networks:
      - web
    volumes:
      - redis_data:/data                   #卷挂载
networks:
  web:
    driver: "bridge"
volumes:                                        #创建卷
  redis_data:
    driver: "local"

#docker-compose——(主要,服务,网络,挂载)

#配置背景

构建一个nginx的镜像并且需要在启动容器时启动很多附带命令是dockerfile实现不了的只能docker run时带参数实现,并且需要批量频繁docker run很麻烦用docker-compose

version: "2.1"

services:

  nginx_demo:

    image: nginx:latest

    restart: "always"

    container_name: "my_nginx"

    networks: 

      - my_net

    volumes: 

      - my_volume

      - /www/nginx:/usr/nginx/nginx.conf

    environment:

      - APP_ENV: dev

    dns:

      - 223.5.5.5

      - 8.8.8.8

#数据卷,并命名为my_volume

volumes:

  my_volume:

    - nginx:/usr/nginx/html

#创建网络

networks:

  my_net:

    driver: "bridge"  

    ipam: 

      driver: default

      config: 

        - subnet: 172.18.0.0/16

          gateway: 172.18.0.1

#elk部署

#docker 地址

Docker @ Elastic

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐