docker 使用总结
1.docker的优势
docker是一个轻量级的虚拟化技术,类似于虚拟机的作用,却比虚拟机更加的轻便,可同时开启的数量也更多,这也就奠定了他拥有更加广阔的空间。
1)持续部署与测试
Docker在开发与运维的世界中具有极大的吸引力,因为它能保持跨环境的一致性。在开发与发布的生命周期中,不同的环境具有细微的不同,这些差异可能是由于不同安装包的版本和依赖关系引起的。
2)环境标准化和版本控制
Docker容器可以在不同的开发与产品发布生命周期中确保一致性,进而标准化你的环境。除此之外,Docker容器还可以像git仓库一样,可以让你提交变更到Docker镜像中并通过不同的版本来管理它们
3)隔离性、安全性
Docker可以确保你的应用程序与资源是分隔开的,并且性能比虚拟机要好。
2. docker的组成
1)image镜像
镜像是一些打包好的已有的环境,可以被用来启动和创建容器,本身不能被直接修改。比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建docker容器,另外docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用
2)container容器
容器是镜像的实例化,是可以修改的,但是都是临时修改。docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以把容器看做是简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序
3)repostory仓库
仓库是集中存储镜像文件的地方,registry是仓库主从服务器,实际上参考注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下载
3.Docker 常用命令
1)、普通指令
启动 Docker
sudo systemctl start docker
停止 Docker
sudo systemctl stop docker
普通重启 Docker
sudo systemctl restart docker
修改配置后重启 Docker
sudo systemctl daemon-reload sudo systemctl restart docker
查看版本
docker version
查看Docker 信息
docker info
Docker 帮助
docker --help
2)、镜像命令
列出本机Docker上已经安装的镜像:
docker images
搜索Docker hub上面的镜像
# 普通搜索,以Tomcat为例 docker search tomcat # 搜索star大于50的镜像实例 docker search -s 50 tomcat
从Docker Hub上面下载镜像
# 以下载tomcat为例 docker pull tomcat[:version]
删除本地的某一个镜像
# 以删除tomcat为例 docker rmi tomcat[:version] # 通过镜像ID删除 docker rmi -f 镜像ID # 通过镜像ID删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG # 删除全部 # docker images -qa : 获取所有镜像ID docker rmi -f $(docker images -qa)
镜像打包与运行
#打包一个我们自己的 tomcat docker commit -a jianghai -m="package my tomcat" 要打包的镜像ID jianghai/tomcat:1.0 # -a : 作者名称 # -m : 打包信息 #启动我们自己打包生成的 tomcat docker run -it -p 7700:8080 jianghai/tomcat:1.0
3)、容器命令
启动容器
# 新建并进入容器,最后一个为本地容器的ID docker run -it --name="rivercentos001" 9f38484d220f # 为容器启一个名称 -name="新容器名称" # 后台运行容器,并返回容器ID,也就是启动守护士容器 -d # 以交互模式运行容器,通常与-t同时使用. -i # 为容器重新分配一个伪终端,通过与-i同时使用 -t # 随机端口映射 [大写P] -P # 端口映射 [小写P] -p
# 数据卷 加参数 ro:容器内的目录只读,不可写
-v /宿主机绝对路径目录:/容器内目录[:ro] 镜像名
查看当前正在运行的Docker 容器
docker ps # 参数 # 列出当前正在运行的以及历史上运行过的 -a # 显示最近创建的容器 -l # 显示最近创建的N个容器 -n # 静默模式,只显示容器编号 -q # 不截断输出 --no-trunc
退出容器
# 退出并停止 exit # 容器不停止退出 ctrl+P+Q
启动容器
docker start 容器ID或容器name
重启容器
docker restart 容器ID或容器name
停止
docker stop 容器ID或容器name
强制停止
docker kill 容器ID或容器name
删除容器
# 删除已经停止的容器 docker rm 容器ID或容器name # 强制删除已经停止或正在运行的容器 docker rm -f 容器ID或容器name 一次性删除所有正在运行的容器 docker rm -f $(docker ps -qa)
重新进入容器
# 第一种方式 docker attach 容器ID或容器名称 # 第二种方式{隔山打牛式,在宿主机向容器发送命令并获取结果} docker exec -t 容器ID或容器名称 ls# 列出文件列表
# 交互
docker exec -it rivertomcat /bin/bash
从容器内拷贝文件到宿主机
docker cp 容器ID或容器名称:/文件路径与文件名 宿主机地址 # 例,拷贝容器river的aaa文件夹下的a.txt到宿主机的当前位置 docker cp river:/aaa/a.txt .
4)、日志命令
docker logs -f -t --tail 10 容器ID或容器名称
# 加入的时间戳
-t
# 跟随最新的日志打印
-f
# 输出最后几行的日志
--tail 行数
# 启动一个centos,并且每两秒在Console输出一个Hello jianghai
docker run -d --name river centos /bin/sh -c "while true;do echo hello jianghai;sleep 2;done"
# 查看最后10行的日志
docker logs -f -t --tail 10 river
#查看容器内的进程
docker top 容器ID或容器名称
4.docker file
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
一个Dockerfile的示例如下所示:
#基于centos镜像
FROM centos
#维护人的信息
MAINTAINER The CentOS Project <303323496@qq.com>
#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件至镜像中web站点下
ADD index.html /var/www/html/index.html
#复制该脚本至镜像中,并修改其权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#当启动容器时执行的脚本文件
CMD ["/run.sh"]
由上可知,Dockerfile结构大致分为四个部分:
(1)基础镜像信息
(2)维护者信息
(3)镜像操作指令
(4)容器启动时执行指令。
Dockerfile每行支持一条指令,每条指令可带多个参数,支持使用以#号开头的注释。下面会对上面使用到的一些常用指令做一些介绍。
4.1 FROM
指明构建的新镜像是来自于哪个基础镜像,例如:
FROM centos:6
4.2 MAINTAINER
指明镜像维护着及其联系方式(一般是邮箱地址),例如:
MAINTAINER Edison Zhou <edisonchou@hotmail.com>
不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:
LABEL maintainer="edisonzhou.cn"
4.3 RUN
构建镜像时运行的Shell命令,例如:
RUN ["yum", "install", "httpd"]
RUN yum install httpd
又如,我们在使用微软官方ASP.NET Core Runtime镜像时往往会加上以下RUN命令,弥补无法在默认镜像下使用Drawing相关接口的缺憾:
FROM microsoft/dotnet:4.4.1-aspnetcore-runtime
RUN apt-get update
RUN apt-get install -y libgdiplus
RUN apt-get install -y libc6-dev
RUN ln -s /usr/lib/libgdiplus.so /lib/x86_64-linux-gnu/libgdiplus.so
4.4 CMD
启动容器时执行的Shell命令,例如:
CMD ["-C", "/start.sh"]
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D
4.5 EXPOSE
声明容器运行的服务端口,例如:
EXPOSE 80 443
4.6 ENV
设置环境内环境变量,例如:
ENV MYSQL_ROOT_PASSWORD 143456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
4.7 ADD
拷贝文件或目录到镜像中,例如:
ADD <src>...<dest>
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html
PS:如果是URL或压缩包,会自动下载或自动解压。
4.8 COPY
拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:
COPY ./start.sh /start.sh
4.9 ENTRYPOINT
启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序,例如:
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
ENTRYPOINT /bin/bash -C '/start.sh'
PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。
4.10 VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器,例如:
VOLUME ["/var/lib/mysql"]
PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。
4.11 USER
为RUN、CMD和ENTRYPOINT执行Shell命令指定运行用户,例如:
USER <user>[:<usergroup>]
USER <UID>[:<UID>]
USER edisonzhou
4.14 WORKDIR
为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:
WORKDIR /data
4.13 HEALTHCHECK
告诉Docker如何测试容器以检查它是否仍在工作,即健康检查,例如:
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
CMD curl -f http:/localhost/ || exit 1
其中,一些选项的说明:
--interval=DURATION (default: 30s):每隔多长时间探测一次,默认30秒
-- timeout= DURATION (default: 30s):服务响应超时时长,默认30秒
--start-period= DURATION (default: 0s):服务启动多久后开始探测,默认0秒
--retries=N (default: 3):认为检测失败几次为宕机,默认3次
一些返回值的说明:
0:容器成功是健康的,随时可以使用
1:不健康的容器无法正常工作
4:保留不使用此退出代码
4.14 ARG
在构建镜像时,指定一些参数,例如:
FROM centos:6
ARG user # ARG user=root
USER $user
这时,我们在docker build时可以带上自定义参数user了,如下所示:
docker build --build-arg user=edisonzhou Dockerfile
5.docker compose
docker compose负责实现Docker容器集群的快速编排,实际就是一个yml批处理文件,用来管理多个容器
5.1:yml文件简介
yml文件默认的名字为:docker-compose.yml
yml包含三大概念:Services、Networks、Volumes
一个service代表一个container(这个container可以从docker hub上拉取的image创建也可以用Dockerfile build出来的image创建)
service的启动类似docker run,我们可以给其指定network和volume
5.2:yml文件的格式与写法
前提:我们本地需要有mysql和wordpress这两个镜像
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
5.3Docker-Compose启动容器
安装好Docker-Compose
新建文件夹(例如Demo)
创建docker-compose.yml文件 并且copy上述2.2的内容到该yml文件中 就可以完成wordpress博客系统的搭建
docker-compose up
注意:docker-compose up启动要保证该目录下的yml文件名称为docker-compose.yml,若为其他 xxx.yml,启动命令则需要改成
docker-compose -f xxx.yml up
5.4Docker-Compose部署一个简单的python flask程序
5.4.1:Python程序如下app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
5.4.2:Dockerfile如下
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
5.4.3:yml文件如下 命名为docker-compose.yml
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000 #将docker contianer的5000端口映射到本地的8080端口
environment:
REDIS_HOST: redis
5.4.4:linux上的部署
将上述三个文件copy到linux机器下(新建一个目录用来存放这三个文件)
执行docker-compose up -d (后台运行这些containers)
ie输入http://IP:8080/ 可以访问到该app
执行效果如下