Docker 有3个核心的概念:镜像、容器和仓库
- 镜像是包含了可运行在Linux内核的程序以及数据,是分层的,只读
- 通过镜像可以创建容器,容器在镜像上增加了一层可读写层来实现的,所以是可读写的,
- 仓库是存储镜像的地方
镜像相关操作
从仓库中拉取远程镜像
docker image pull node
# 或
docker pull node
docker search imagename 查找镜像
docker images查看本机的镜像列表
docker inspect imagename 查看镜像元信息(比如镜像指定的端口号,CMD,ENTRYPOINT,默认挂载目录等)
移除镜像
docker image rm imageid
# 或
docker rmi imageid
容器相关操作
运行容器(有三种运行模式), 本地没有被使用的镜像会自动拉取
docker run <images> # 直接运行容器 运行后会自动退出(没有被挂起的情况下,比如CMD执行了tail -t或者nodemon等挂起的命令)
docker run -d --name 别名 <images:tags> <commond> # 后台运行 守护进程 常驻内存
docker run -it --name 别名 <images:tags> <commond> # 终端交互方式,可以直接和容器交互
docker run -d --name mymongo mongo:4 /bin/bash # 对容器指定别名
docker run -p 80:80 nginx # 对容器端口进行映射 -P 则随机绑定端口号
docker run -v /宿主内路径:容器内路径 // 挂载容器内目录到宿主机
再次进入容器
docker exec -it containerid /bin/bash
docker logs containerid 查看容器标准输出
docker port containerid 查看当前映射端口配置和绑定地址
查看容器
docker ps #查看已启动的容器
docker ps -a #查看所有容器 包括已停止运行的
停止容器
docker stop containerid1,containerid2 ...
重启容器
docker restart containerid
移除容器
docker rm containerid
docker支持的选项
Options:
--config string Location of client config files (default "/Users/bj/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides
DOCKER_HOST env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal")
(default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/Users/bj/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/Users/bj/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/Users/bj/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
docker支持的命令
Commands:
attach Attach local standard input, output, and error streams to a running container
build 根据Dockerfile创建一个镜像
commit 以容器为基础创建镜像
cp 在宿主机和容器之间拷贝文件或目录
create 创建一个新容器
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec 正在运行的容器中执行命令
export Export a container's filesystem as a tar archive
history 显示镜像的历史信息
images 查看镜像列表
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill kill一个或多个正在运行的容器
load 从tar文件或者标准输入加载镜像
login 登录Docker仓库
logout 登出Docker仓库
logs 查看容器日志
pause 暂停一个或多个容器中的所有进程
port 列出端口映射或容器的特定映射
ps 查看正在运行的容器列表(-a 可以查看所有容器)
pull 从仓库拉取镜像
push Push镜像到远程仓库
rename 对容器进行重命名
restart 重启一个或多个容器
rm 删除一个或多个容器
rmi 删除一个或多个镜像
run 在新的容器中执行命令
save 保存一个或多个镜像到tar文件
search 在Docker Hub上检索镜像
start 启动一个或多个已停止的容器
stats Display a live stream of container(s) resource usage statistics
stop 停止一个或多个正在运行的容器
tag 对已有镜像添加tag
top 查看某个镜像中的进程情况
unpause Unpause all processes within one or more containers
update 更新一个或多个容器的配置
version 查看docker版本信息
wait Block until one or more containers stop, then print their exit codes
查看docker命令具体使用方法
# docker COMMAND --help
docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
构建镜像
使用Dockerfile进行构建
通过docker commit 将容器保存为镜像
1. 通过docker commit生成镜像
Dockerfile常用配置
FROM 指定使用什么镜像作为基础 (指定更小的基础镜像来尽可能减少镜像体积)
WORKDIR 指定容器的工作目录(如果没有会自动创建)
COPY 将本地目录拷贝到容器内目录中
ADD 类似COPY,像容器内目录添加文件,不同是可以添加网络地址。如果被复制文件是压缩文件会自动解压
RUN 容器构建时执行,每一个RUN都会增加新的层,可以将多个需要执行的命令放到一个RUN中执行(使用&&连接)来减少镜像体积
CMD 容器启动时执行的命令,如果有多个CMD,最后一个生效。而且会被docker run命令行参数中指定要运行的程序所覆盖
ENTRYPOINT 指定入口。和CMD同时存在:如果ENTRYPOINT是非JSON格式则使用ENTRYPOINT,否则CMD和ENTRYPOINT拼接执行。且不会被docker run参数中命令覆盖(docker run 指定--entrypoint选项时除外)
EXPOSE 声明镜像对外暴露端口
VOLUME 指定挂载目录, 启动容器忘记数据卷时会自动挂载到匿名卷(docker run -v 可以修改挂载点)
ENV 指定环境变量,全局生效
AKG 也可以指定环境变量,编译过程中生效,可以docker时可以通过--build-akg key=value覆盖.也可以通过赋值给ENV实现传递到执行阶段
ONBUILD 当基于此镜像构建镜像时执行,参数可以是Dockerfile中其他命令,比如ENV CMD
FROM alpine
WORKDIR /app
COPY src/ /app
RUN npm install
CMD ['npm','start']
ENV NODE_ENV production
需要注意的是Dockerfile中可以存在多个FROM指令,即可以进行多阶段个构建(并非生成多个镜像,最后生成的镜像只有最后一个FROM,其他的FORM会被丢弃),比如可以分为:创建基础镜像,编辑打包,发布,运行等
我们可以根据Dockerfile构建镜像
docker build -t imagename .
将从仓库pull的镜像或自己构建的镜像导出
$ docker image save imagename -o ./image-name.tar.gz
将导出的镜像文件导入到本地镜像列表中
$ docker load < ./image-name.tar.gz
2. 通过docker commit生成镜像
docker commit -a 'xiaozhu<1289****@qq.com>' containerid testimage:0.0.1
docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") // 作者信息
-c, --change list Apply Dockerfile instruction to the created image // 对创建的镜像应用Dockerfile指令
-m, --message string Commit message //提交信息
-p, --pause Pause container during commit (default true) // commit过程中暂停运行容器