文章目录
- 1. 构建镜像
- 2. docker
- 2.1安装
- 2.2 启动Docker引擎
- 2.3 创建docker用户组
- 2.4macos安装
- 2.5 镜像加速器
- 2.5.1 ubuntu配置
- 3.docker run
- 4.查看虚悬镜像
- 5.commit理解镜像
- 6.Dockerfile
- 6.1FROM
- 6.2RUN
- 7.容器运行
- 8.VOLUME匿名卷
- 9. EXPOSE 声明端口
- 10. WORKDIR指定工作目录
- 11. USER制定当前用户
- 12.docker 保存
- 13.docker load
1. 构建镜像
在构建镜像的时候,会一层层的构建,前一层是后一层的基础.每一层构建就不会在发生改变,后一层的任何改变只发生在自己这一层.比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅仅在当前层标记该文件已经删除.但是在容器运行的时候,虽然你不会看到这个文件,但是实际上该文件一直会跟随镜像.因此在构建镜像的时候需要额外小心,删除本层的无用文件的时候,只需要在该层结束的时候清理掉.
容器读写仅仅最好直接对宿主机的挂载路径读写,最高效与安全.
2. docker
2.1安装
$ curl -sSL https://get.docker.com/ |sh
$ sudo apt-get install docker-engine
2.2 启动Docker引擎
$ sudo service docker start
$ sudo systemctl enable docker
$ sudo systemctl start docker
2.3 创建docker用户组
- 注释:root权限一般不直接使用,需要建立docker用户组
$ sudo groupadd docker
$ sudo usermod -aG docker $USER # 添加当前用户到docker组下,避免每次使用sudo
2.4macos安装
$ brew cask install docker
2.5 镜像加速器
2.5.1 ubuntu配置
阿里云申请加速器: https://qwl3529h.mirror.aliyuncs.com
配置加速器,编辑/etc/default/docker文件,在DOCKER_OPTS中获的加速器配置
DOCKER_OPTS="--registry-mirror=https://qwl3529h.mirror.aliyuncs.com"
重启docker
sudo service docker restart
3.docker run
参数 -it i是指交互 t是指终端 --rm是指容器退出后随后删除
4.查看虚悬镜像
sudo docker images -f dangling=true
docker rmi $(docker images -q -f dangling=true)
5.commit理解镜像
$ docker commit --author "yanerle 2681506@gmail.com" --message "修改内容" container_name image_name:tag
$ docker history images_name:tag #查看镜像历史变更记录
6.Dockerfile
6.1FROM
FROM 基础镜像
6.2RUN
shell格式:RUN 命令
exec格式:RUN [“可执行文件”,“参数1”,]
写dockerfile的时候每一层都要清理掉无关的文件
COPY ./package.json /app/ # 目标路径可以是绝对路径,可以是相对路径
ADD 指令会令镜像构建缓存失效,从而可能会令镜像变得缓慢.
7.容器运行
- 容器运行是一个进程.这就要在运行的时候将参数输入进来.docker run -it ubuntu会直接进入bash.
- docker run -it ubuntu cat /etc/os-release 用cat /etc/os-release命令替换了/bin/bash命令 输出了系统版本信息.
- 容器没有前后台之分,容器只有前台.因为sh是主进程,指令的命令"service nginx start"结束后,主进程也结束.
8.VOLUME匿名卷
VOLUME /data
/data为匿名卷,任何/data写入的数据会写在挂载的路径下.docker run -d -v mydata:/data xxxx 会覆盖这个路径
9. EXPOSE 声明端口
- EXPOSE仅仅是声明运行容器的时候提供服务端口,仅仅是声明不会开启端口. docker run -p <宿主机>:<容器端口> 是真正开发端口.
10. WORKDIR指定工作目录
- WORKDIR <工作路径>,指令可以制定哦工作目录,以后各层的当前目录就被改为制定的目录,该目录已经存在,WORKDIR不会帮你创建目录.
- 不指定路径的话各层其实是不同的容器,执行环境也就不同,造成各层的工作路径不同.
11. USER制定当前用户
- USER指令和WORKDIR相似,都是改变环境变量影响以后的各层.USER是改变之后各层的用户.
- USER仅仅是切换用户,前提是用户你已经建立.
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN ["redis-server"]
12.docker 保存
$ docker save images_name | gzip > name_.tar.gz
13.docker load
$ docker load -i name_.tar.gz
$ docker rmi images_name