Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
docker基本命令
查看已有docker镜像:docker images
搜索docker镜像:docker search 镜像名称
下载镜像:docker pull 镜像:版本号
,例:docker pull python:3.5
运行交互式容器: docker run -it 镜像:标签 /bin/bash,例:docker run -it ubuntu:15.10 /bin/bash
,其中-i代表允许你对容器内的标准输入 (STDIN) 进行交互,-t表示在新容器内指定一个伪终端或终端。
运行容器参数: -d:让容器在后台运行,-P:将容器内部使用的网络端口映射到主机上,-p:设置所映射的端口,–name:指定容器名称。
查看运行中的容器: docker ps
查看全部容器: docker ps -a
停止容器: docker stop 容器名称/容器id
启动容器: docker start 容器名称/容器id
重启容器: docker restart 容器名称/容器id
删除容器:docker rm 容器名称/容器id
删除运行中的容器:docker rm -f 容器名称/容器id
查询最后一次创建的容器: docker ps -l
查看端口映射情况:docker port 容器名称/容器id
查看容器内部运行的进程:docker top 镜像名称/容器id
自定义镜像的两种方法
1、更新原有镜像:
(1)进入容器进行操作。
(2)exit退出容器。
(3)使用命令docker commit来提交容器副本:
docker commit -m="提交的描述信息" -a="指定镜像作者" 容器名称/容器id 目标镜像名
(4)更新镜像并删除旧镜像:假设原镜像为centos:latest,新操作后的新镜像为new_centos:latest。
- 查看是否存在依赖:
docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=原镜像id --quiet)
- 保存新镜像:
docker save -o centos.tar new_centos:latest
- 删除新旧镜像:
docker rmi 新镜像id 旧镜像id
,(删除之前需要需要先删除容器)
- load新镜像:
docker load -i ./centos.tar
- 此时我们运行该镜像可以看到1.py文件:
2、使用Dockerfile自定义镜像:
Dockerfile有一些命令用于自定义镜像:
FROM:FROM <image>[:<tag>] [AS <name>]
,设置基础镜像,即该镜像所依赖的镜像。
RUN:RUN <command> \ ["executable", "param1", "param2"]
,执行shell脚本。
CMD:CMD ["executable","param1","param2"] \ ["param1","param2"] \ command param1 param2
,启动程序后执行的默认命令,DockerFile中只有一个CMD,多于一个将执行最后一个。
LABEL:LABEL <key>=<value> <key>=<value> ...
,镜像标签。
EXPOSE:EXPOSE <port> [<port>/<protocol>...]
,暴露容器的端口,EXPOSE 仅仅是声明容器打算使用什么端口,并不会自动在宿主进行端口映射。
ENV:ENV <key> <value> \ <key>=<value>
,设置容器环境变量,可以使用docker run --env <key>=<value>
修改环境变量。
ADD:ADD [--chown=<user>:<group>] <src>... <dest> \ [--chown=<user>:<group>] ["<src>",... "<dest>"]
,拷贝一个新文件,或者文件夹或者远程文件的 URLS,把他们添加到,镜像的文件系统中。 为绝对路径或者由WORKDIR定义的相对路径。
COPY:COPY [--chown=<user>:<group>] <src>... <dest> / [--chown=<user>:<group>] ["<src>",... "<dest>"]
,与ADD命令相似。
ENTRYPOINT:ENTRYPOINT ["executable", "param1", "param2"] / command param1 param2
,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数,ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 –entrypoint 来指定。当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,不再是直接的运行其命令,而是将CMD 的内容作为参数传给 ENTRYPOINT 指令。
ENTRYPOINT与CMD的比较:
- 当有多个ENTRYPOINT CMD它们都只执行最后一个
- 当容器为一个可执行文件时应该定义ENTRYPOINT
- 当同时定义ENTRYPOINT 和 CMD时,CMD为ENTRYPOINT的默认参数
- 当docker执行run命令时,在里面指定CMD时,CMD将会被重写。
VOLUME:VOLUME ["/data"]
,在制作镜像时挂载卷。会在宿主机上自动生成一个对应的共享目录。
USER :USER <user>[:<group>] / <UID>[:<GID>]
,给镜像添加一个用户。
WORKDIR :WORKDIR /path/to/workdir or WORKDIR to_workdir /path/to/workdir
,为RUN, CMD, ENTRYPOINT, COPY, ADD 创建工作目录。
ARG:ARG <name>[=<default value>]
,dockerfile中的变量。
(1)创建一个Dockerfile文件,然后进入该文件编写自定义镜像:
1 FROM centos:latest
2 RUN /bin/echo 'root:950824' |chpasswd
3 RUN useradd test
4 RUN /bin/echo 'test:950824' |chpasswd
5 EXPOSE 22
6 EXPOSE 80
7 CMD /usr/sbin/sshd -D
(2)使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像:
docker build -t centos:latest .
-t指定要创建的目标镜像名,. 指定Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径。
(3)使用docker images查看自定义的镜像: