Docker

Docker

docker 是一个容器软件,能实现类似虚拟机的功能。

docker 和 虚拟机对比

docker 比虚拟机更轻量,资源利用率更高,搭建更加简单,特别在微服务方面更加的适用

docker概念

container #镜像运行的环境,一个镜像一个容器
services # 启动一个服务,能设置port,使用stacks启动service,用于docker集群

docker架构

docker cli

image.png

docker frame

Dockerfile

    # 构建简单的dockerfile
    FROM ubuntu #基础镜像
    WORKDIR /root #工作路径
    COPY . /app #复制当前目录下所有东西到app
    RUN command #在容器里面运行命令
    EXPOSE 80 # 暴露端口
    ENV A 1 # 设置环境变量
    CMD ["sleep", "1000"] # 执行命令

docker build

docker build -t ubuntu:v1.0 -f path 
.dockerignore # 里面使用正则表达式,里面的文件在add或者copy的时候忽略掉(注释除外)

docker file detail command

    #lable
    ## 打标签
    ## run
    # docker run 编译的时候执行命令,执行格式为/bin/sh -c 当使用管道(echo 1 | cat)需要写成RUN set -o pipefail && echo 1 | cat
    ## cmd
    # CMD ["executable", "param1", "param2"…]
    ## expose
    # expose 80。开放容器类的端口,这里比较重要,这里并不是主机和容器映射,只是开放了端口,使用-P的时候会随机选取主机的一个端口来映射
    # copy or add
    ## copy file path 复制文件,add复制压缩包,能够自动解压,但是add不建议使用
    # enterpoint and cmd
    ##  enterpoint 这个命令如果有,那cmd会加到enterpoint后面,运行docker run的命令也会加到后面
    # volume
    ## volume path 挂载目录,这里会挂在相同的目录
    # user
    ## user root|non-root 设置执行命令的用户
    # workdir
    ## workdir path 设置工作路径
    # onbuild
    ## onbuild run xx 别的镜像以这个镜像为原型时,build之前需要执行的命令,可以设置安全等东西
    # stopsignal
    ## stopsignal sigkill容器退出的时候应该执行的linux signal
    # arg
    ## arg user[=1]定义dockerfile中的变量
    # healthcheck
    ## HEALTHCHECK [optional] CMD "command" 容器启动后的健康检查
    # shell
    ## shell command cmd的另一种方式

dockerfile multi-stage

# First stage: complete build environment
FROM maven:3.5.0-jdk-8-alpine AS builder
# add pom.xml and source code
ADD ./pom.xml pom.xml
ADD ./src src/
# package jar
RUN mvn clean package

# Second stage: minimal runtime environment
From openjdk:8-jre-alpine
# copy jar from the first stage
COPY --from=builder target/msb-1.0.jar msb.jar #这里--from指定基础容器,相当于把frist stage编译成Builder,然后运行,在将容器里面的target/msb-1.0.jar copy到现在的msb.jar
# run jar
CMD ["java", "-jar", "msb.jar"]

docker-compose

    # docker-compose.yaml
    version: "3"
    services:
      web:
        image: ubuntu:v1.0
        deploy:
          replicas: 2
          resources:
            limits:
              cpus: "0.1m"
              memory: 150M
          restart_policy:
            condition: on-failure
        ports:
          - "8080:8080"
        networks:
          - webnet
    networks:
      webnets:  

docker-compose deploy

docker stack deploy -c docker-compose.yml testserver #开始
docker stack rm testserver # 删除

docker user tip

#运行一个镜像,
# -it 以交互模式运行,适合需要debug的时候使用,
# --rm退出容器之后删掉容器,默认不会删掉,只是状态会变成exit
# -p port 映射端口到主机,容器和主机端口一样
# -p hostport:containerport 可以指定映射
# -P 将端口随机映射到主机,dockerfile中指定
# images_name:version 是你的镜像名字
# command 是要执行的命令,bash或者sh能进入终端
docker run -it --rm [-p port | -p hostport:containeport | -P] images_name:version command 

# 操作容器
docker ps [-a] # 查看容器,-a 会把已经退出的容器显示出来
docker logs container-id # 查看容器log,一般容器出错了需要查看
docker stop container-id # 停止一个容器
docker rm container-id # 删除容器,需要先停止
docker commit container-id image_name:verison # 把一个容器提交成镜像,制作镜像的一种新方式

# 操作镜像
docker images # 查看已有的所有镜像
docker rmi image_name # 删除一个镜像
docker tag image_name image_name1 # 给镜像打tag,相当于rename,制作固定名字镜像的一种方式
docker save image_name > file_path # 将镜像保存为tar包
docker load < file_path # 将tar包解析成image,save load适用于本地安装镜像

# 认证登录
docker login register-url # 注册,根据提示输入即可
docker logout register-url # 退出,自动清除$HOME/.docker/config里的内容

docker problem

  • docker pull 镜像很慢
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://4e70ba5d.m.daocloud.io
systemctl restart docker
  • docker login and register url is http
 vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://设置的hostname"],
"insecure-registries" : ["http://设置的hostname"] 这里是添加http安全规则
}
systemctl restart docker
  • docker login and cannot store certification
  可能是装了go的一个模块(我的出错原因是这个)
  apt purge golang-docker-credential-helpers

总结

打包新镜像的三种方式
docker tag 针对镜像
docker commit 针对容器
dockerfile 针对镜像

你可能感兴趣的:(Docker)