资源:
7 步精简 Docker 镜像几百MB(上)
Dockerfile最佳实践
Docker中文文档
安装Docker
#安装Docker
wget -qO- https://get.docker.com/ | sh
#设置开机自启
sudo systemctl enable docker
sudo systemctl start docker
#添加用户到docker组,后续不用每次都sudo执行命令
sudo groupadd docker
sudo usermod -aG docker $USER
镜像管理
#镜像仓库
docker search 搜索镜像,如 docker search ubuntu
docker pull 从docker-hub下载镜像,docker pull ubuntu:16.04
docker login 登录docker-hub账号,方便后面将自己的镜像同步到docker-hub服务器端
docker push 将自己建立的镜像同步到docker-hub中
#本地镜像管理
docker images 查看本地镜像
docker rmi 删除指定镜像,可指定-f参数强制删除
docker tag 标记某镜像,docker tag ubuntu:15.10 runoob/ubuntu:v3,将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像
docker history 查看镜像的创建历史
docker save 将指定镜像打包,docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3,将镜像runoob/ubuntu:v3 生成my_ubuntu_v3.tar文档
docker import 从归档文件中创建镜像,docker import my_ubuntu_v3.tar runoob/ubuntu:v4,从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4
docker build 从dockerfile创建镜像,docker build -t biodocker:v1 .
容器操作
docker ps 列出运行的容器的信息
docker inspect 获取容器/镜像的元数据
docker top 查看容器中运行的进程信息,支持 ps 命令参数,docker top mymysql
docker attach :连接到正在运行中的容器
docker events 从服务器获取实时事件
docker logs 获取容器的日志,docker logs -f mynginx,跟踪查看容器mynginx的日志输出
docker port 列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口,docker port mymysql,查看容器mynginx的端口映射情况
docker cp 主机与容器之间的数据拷贝,docker cp /www/runoob 96f7f14e99ab:/www/,将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下
docker commit 从容器创建一个新的镜像
docker diff 检查容器里文件结构的更改
docker run 创建一个新的容器并运行命令,常用方式为docker run -it ubuntu:16.04
docker start/stop/restart 启动,停止,重启一个容器,docker start ubuntu
docker kill 杀掉一个运行中的容器
docker rm 删除一个容器
docker pause/unpause 暂停/恢复容器中所有的进程
docker exec 在运行的容器中执行命令,docker exec -it mynginx /bin/sh /root/runoob.sh,在容器mynginx中以交互模式执行容器内/root/runoob.sh脚本
#################################################################
一个使用dockerfile创建镜像的栗子:
docker build --no-cache=true -t biodocker:v1
# --no-cache:不使用缓存,每条指令都重新生成镜像(速度会很慢)
# -f:明确指定Dockerfile
# -t:给生成的镜像打上标签
dockerfile中的命令
FROM
第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。
格式为 FROM <image>
或FROM <image>:<tag>
。
MAINTAINER
格式为 MAINTAINER <name>
,指定维护者信息。
RUN
把复杂的或过长的 RUN 语句写成以 \ 结尾的多行的形式,以提高可读性和可维护性。
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y \
bzip2 \
wget
EXPOSE
在Dockerfile中你可以映射私有和公有端口,但永远不要通过Dockerfile映射公有端口。这样运行多个镜像的情况下会出现端口冲突的问题。
EXPOSE 80:8080 # 80映射到host的8080,不提倡这种用法
EXPOSE 80 # 80会被docker随机映射一个端口
ADD COPY
虽然 ADD
与 COPY
功能类似,但推荐使用 COPY
。 COPY
只支持基本的文件拷贝功能,更加的可控。而 ADD
具有更多特定,比如tar文件自动提取,支持URL。 通常需要提取tarball中的文件到容器的时候才会用到 ADD
。
CMD ENTRYPOINT
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
CMD
和 ENTRYPOINT
支持两种语法:
CMD /bin/echo
CMD ["/bin/echo"]
VOLUME
格式为 VOLUME ["/data"]
。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
USER
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
WORKDIR
WORKDIR
的路径始终使用绝对路径可以保证指令的准确和可靠。 同时,使用 WORKDIR
来替代 RUN cd ... && do-something
这样难以维护的指令。
格式为 WORKDIR /path/to/workdir
。
为后续的 RUN
、CMD
、ENTRYPOINT
指令配置工作目录。