Docker 全攻略
一. docker的优缺点
- docker优点:
- Docker的资源利用率比传统的虚拟机更高
- Docker支持跨节点部署
- 版本可控,组件可复用
- 共享镜像
- 轻量,易维护
- docker缺点:
- 宿主资源没有完全做到隔离
- Golang语言尚未成熟
————————-Docker—————————-
docker 运行MySQL服务:docker run --name pwc-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
运行该命令可能会报错:/usr/bin/docker-current: Error response from daemon: Conflict. The container name “/mysql-server” is already in use by container bdc8d8c475cb86695c466d23fd7102221f2c040898c2d576f94cd06c93ca811b. You have to remove (or rename) that container to be able to reuse that name..
解决办法:使用命令:docker ps -l
列出容器中已经存在的mysql,然后使用docker run CONTAINER ID
运行即可
一. Docker命令:
镜像相关
docker search java
: 搜索存放在Docker Hub中的镜像,关键词为 javadocker pull java
: 从Docker Registry上下载镜像- eg: docker pull reg.itmuch.com/java:7: 下载标签为7的镜像
docker images
: 列出下载的镜像docker rmi [OPTIONS] IMAGE [IMAGE...]
: 删除指定镜像- eg1:
docker rmi hello-world
删除名称为hello-world的镜像 - eg2:
docker rmi -f $(docker images)
删除所有镜像 -f 强制删除
- eg1:
启动,停止docker
- 启动:
systemctl start docker
- 守护进程重启:
sudo systemctl daemon-reload
- 重启docker服务:
systemctl restart docker
或者sudo service docker restart
- 关闭docker服务:
service docker stop
或者systemctl stop docker
容器相关
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
:新建并启动一个容器
参数列表:- -d:后台运行
- -p:随机端口映射
- -p:指定端口映射(四种方式)
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- –network:指定网络模式
- –network=bridge 连接到默认的网桥
- –network=host 容器使用宿主机的网络
- –network=container:NAME_or_ID 告诉docker让新建的容器使用已有容器的网络配置
- –network=none 不配置该容器的网络,用户可以自定义网络配置
- eg1:docker run java /bin/echo “Hello World” 和在本地执行 echo 一样
- eg2:docker run -d -p 91:80 nginx args:-d 后台运行 -p宿主机端口:容器端口 # 开放容器端口到宿主机端口
docker ps
列出容器docker stop dafaf2ba6b34
根据容器ID来停止实例docker kill dafaf2ba6b34
强制停止容器docker start [OPTIONS] CONTAINER [CONTAINER...]
启动一个或多个已经停止的镜像docker restart [OPTIONS] CONTAINER [CONTAINER...]
重启容器,应该配合 –time参数,避免死锁docker attach dafaf2ba6b34
进入容器 (不推荐使用)-
nsenter
进入容器 - 用法:docker inspect --format "" $CONTAINER_ID
来获取PID -docker inspect --format "" dafaf2ba6b34
得到 12248 -nsenter --target 12248 --mount --uts --ipc --net --pid
即可进入容器 #### 进入容器docker exec -it 00f02d814a42 /bin/bash
docker rm dafaf2ba6b34
删除容器 如果要删除正在运行的容器 加入-f参数 - 删除所有容器 docker rm -f $(docker ps -a -q)docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
基于现有镜像重新构建镜像docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
基于现有image模板创建容器,但是不允许容器(和run的区别)docker diff CONTAINER
检查容器文件系统上的更改docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
在运行的容器中运行指令docker history [OPTIONS] IMAGE
返回image在构建过程中所有执行过的命令docker inspect [OPTIONS] NAME|ID [NAME|ID...]
探查docker的信息(容器信息,镜像信息)docker kill [OPTIONS] CONTAINER [CONTAINER...]
kill容器docker logs [OPTIONS] CONTAINER
打印容器内部的日志docker rename CONTAINER NEW_NAME
对容器重命名docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
对image重命名docker stats [OPTIONS] [CONTAINER...]
对容器的资源进行监控docker top CONTAINER [ps OPTIONS]
统计容器内运行的进程信息-
docker search redis
从官网搜索redis的镜像 docker login
登录到Docker仓库-
docker logout
注销 docker export redis-mm > latest.tar
将名称为redis-mm的容器导出-
docker inport latest.tar
将从tar包中导入容器 docker pause CONTAINER [CONTAINER...]
暂停容器,但不停止容器docker port CONTAINER [PRIVATE_PORT[/PROTO]]
显示容器所暴露的端口
补充
docker build -t friendlyname
.# 使用此目录的 Dockerfile 创建镜像docker run -p 4000:80 friendlyname
# 运行端口 4000 到 90 的“友好名称”映射docker run -d -p 4000:80 friendlyname
# 内容相同,但在分离模式下docker ps
# 查看所有正在运行的容器的列表docker stop <hash>
# 平稳地停止指定的容器docker ps -a
# 查看所有容器的列表,甚至包含未运行的容器docker kill <hash>
# 强制关闭指定的容器docker rm <hash>
# 从此机器中删除指定的容器docker rm $(docker ps -a -q)
# 从此机器中删除所有容器docker images -a
# 显示此机器上的所有镜像docker rmi <imagename>
# 从此机器中删除指定的镜像docker rmi $(docker images -q)
# 从此机器中删除所有镜像docker login
# 使用您的 Docker 凭证登录此 CLI 会话docker tag <image> username/repository:tag
# 标记<image>
以上传到镜像库docker push username/repository:tag
# 将已标记的镜像上传到镜像库docker run username/repository:tag
# 运行镜像库中的镜像
二 Dockerfile
Dockerfile 内置的命令及其作用
内置命令 | 作用 |
---|---|
FROM | 指明基础镜像的名称。(必填项) |
MAINTAINER | 可用于提供作者、版本及其他备注信息。(可选项) |
RUN | 用于执行后面的命令。当RUN执行完毕,将产生一个新的文件层。(可选项) |
CMD | 指定此镜像启动时默认执行命令。(可选项) |
LABEL | 用于在镜像中添加元数据。例如版本号、构建日期等。(可选项) |
EXPOSE | 用于指定需要暴露的网络端口号。(可选项) |
ENV | 用于在镜像中添加环境变量。(可选项) |
ADD | 向镜像中添加新文件或者新目录。(可选项) |
COPY | 从主机向镜像复制文件。(可选项) |
ENTRYPOINT | 在镜像中设定默认执行的二进制程序。(可选项) |
VOLUME | 向镜像中挂载一个卷组。(可选项) |
USER | 在镜像构建过程中,生成或切换到另外一个用户。(可选项) |
WORKDIR | 设定此镜像后续操作的默认工作目录。(可选项) |
ONBUILD | 配置构建触发指令集。(可选项) |
Dockerfile 常用指令 格式为: 指令名称 参数
- ADD 复制文件:从src目录复制文件到dest目录
- ADD <src>… <dest>
- ADD [”<src>”,…”<dest>”]
- eg: ADD hello.jar world.jar 将hello.jar 复制为world.jar
- ARG 设置构建参数
- ARG类似于ENV,ARG设置的是构建时的环境变量,在运行时不会存在
- eg:ARG user1=someUser
- CMD 容器启动命令:CMD指令用于为执行容器提供默认值。每个Dockerfile只有一个CMD命令,如果有多个,那么只有最后一条被执行。
-
eg:CMD echo “This is a test.” wc -
-
- COPY 复制文件:和ADD类似,COPY不支持URL和压缩包
- COPY <src>… <dest>
- COPY [”<src>”,…”<dest>”]
-
ENTRYPOINT 入口点:和CMD命令一样,指定docker容器启动时执行的命令,可多次设置,但只有最后一个有效
- ENV 设置环境变量
- ENV <key> <value>
- ENV <key>=<value>
- eg:ENV JAVA_HOME /path/to/java
- EXPOSE 声明暴露的端口 EXPOSE <port> [<port>…]
- eg1:单个端口
- 1.EXPOSE port1
- 2.docker run -p port1 image 等价于:docker run -P image
- eg2:多个端口
- 1.EXPOSE port1 port2 port3
- 2.docker run -p port1 -p port2 -p port3 image
- 3.也可以指定需要映射到宿主机器上的端口号
- 3.1 docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
- eg1:单个端口
- FROM 指定基础镜像,必须写在所有指令的前面
- eg1:FROM <image>
- eg1:FROM <image>:<tag>
- eg1:FROM <image>@<digest>
- LABEL 为镜像添加元数据
- eg: LABEL version=1.0
- MAINTAINER 指定维护者信息
- eg : MAINTAINER Monk<guangliang1120@gmail.com>
-
RUN 执行命令 RUN [“/bin/bash”, -c, “echo hello”]
- USER 设置用户:用于设置启动镜像时的用户或者UID,写在该指令后的RUN,CMD以及ENTRYPOINT指令都使用该用户执行命令
- eg:USER daemon
- VOLUME 指定挂载点 提供持久化存储
- eg:VOLUME /data
- WORKDIR 指定工作目录,写在该指令后的RUN,CMD以及ENTRYPOINT指令都将该目录作为当前目录
- eg:WORKDIR /path/to/workdir
三:Docker-compose
概念:docker-compose是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose, 那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。 而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中, 以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。