一、docker镜像,容器的区别
镜像和容器就像编程里面的类和实例的关系,镜像是静态的,容器是动态的,也即是运行起来的
二、docker镜像制作
首先为啥要自己制作,网上不是有很多docker镜像吗? 不适合或者感觉不安全
a、制作流程
1)创建工作目录,后面所有的工程文件都放置在这个目录下,可以有子目录
~/docker/helloworld
|-- Dockerfile
|-- helloworld.go
`-- test
`-- test.go
2) 编写Dockerfile文件
Dockerfile文件是用于制作docker镜像的脚本文件,里面都是docker内置命令,例如:指定基础镜像、安装依赖的软件、配置环境变量等,具体可以查询官方手册
# 使用官方提供的 Go 镜像作为基础镜像,基础镜像可以通过docker search 进行查询
FROM golang
# 将工作目录设置为 /myproject (对应到虚拟进程中就是/myproject目录,可以通过attach或者docker exec 命令进入虚拟进程中查看)
WORKDIR /myproject
# 将当前目录下的所有内容复制到 /myproject 下
COPY . /myproject
# 允许宿主机访问容器的 8000 端口
EXPOSE 8080
# 设置容器进程为:go run helloworld.go
CMD go run helloworld.go
3)编译生成镜像
cd 到步骤1中创建的工作目录
docker build -t helloworld .
#编译指定版本镜像(注意结尾一定要加. 代表当前目录)
docker build -t helloworld:1.0 .
#列出本地镜像
docker images
4)创建并启动容器
docker run -d --name myhello -p 8080:8080 helloworld:1.0
参数选项:
-i 以交互模式运行容器,通常与 -t 同时使用
-t 启动容器后,为容器分配一个命令行,通常与 -i 同时使用
-v 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d 守护进程,后台运行该容器
-p 指定端口映射,格式:主机(宿主)端口:容器端口
-P 随机端口映射,容器内部端口随机映射到主机的端口(49153起始 49153到65535)
-u 以什么用户身份创建容器
–name “nginx-lb” 容器名字
-m, --memory bytes 设置容器使用内存最大值
-h, --hostname string 指定容器的 host name
–dns 8.8.8.8 指定容器 dns 服务器
-e username=“ritchie” 设置环境变量
–restart Docker 重启后,容器是否自动重启
–privileged 容器内是否使用真正的 root 权限
5)相关的docker命令
查看容器状态
docker ps -a
关闭/启动/重启 容器
docker stop/start/restart ContainerID
进入后台运行的容器
#连接到正在运行中的容器
docker attach containerID
docker exec -it containerID /bin/bash
查看容器相关的资源占用情况
docker stats
查看容器中运行的进程情况
docker top containerID
查看容器所有相关的配置信息
docker inspect containerID
查看容器日志
docker logs containerID
查看容器的端口映射情况
docker port containerID
6)镜像/容器的导入导出
差异:
docker save 是保存镜像,有commit记录,可以支持多个镜像打包,因为有记录,所以大小偏大
docker export 是保存容器,没有记录
保存导出:
docker save -o golang_hello.tar helloworld:1.0
docker export containerID > golang_hello.tar
docker import可以为镜像指定别名,load不可以
导入还原:
docker import [options] file|URL|- [REPOSITORY[:TAG]]
docker import golang_hello.tar
docker import golang_hello.tar - golang:1.0
docker load -i golang_hello.tar 或者 docker load < golang_hello.tar