Docker
docker 是一个容器软件,能实现类似虚拟机的功能。
docker 和 虚拟机对比
docker 比虚拟机更轻量,资源利用率更高,搭建更加简单,特别在微服务方面更加的适用
docker概念
container #镜像运行的环境,一个镜像一个容器
services # 启动一个服务,能设置port,使用stacks启动service,用于docker集群
docker架构
docker cli
image.pngdocker 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 针对镜像
网友评论