【过程资产】docker知识积累V2
[手工目录](****啥时候可以插入目录呀)
一、docker安装
二、docker及Dockerfile常用命令
三、docker使用Demo
四、异常处理
五、Compose编排
########################################
一、docker安装
------ 准备工作 ------
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
>uname -r #查看当前的内核版本
>cat /etc/os-release #查看centos版本
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
>yum update
3、卸载旧版本(如果安装过旧版本的话)
>yum remove docker docker-common docker-selinux docker-engine
------ 安装步骤 ------
# step 1: 安装必要的一些系统工具>yum install -y yum-utils device-mapper-persistent-data lvm2# Step 2: 添加软件源信息(使用阿里云的镜像)>yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# Step 3: 更新并安装 Docker-CE>yum makecache fast>yum -y install docker-ce
# Step 4:daocloud镜像改用国内
修改Docker配置文件/etc/default/docker如下:
如果没有,则新建文件docker
DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"# Step 5: 开启Docker服务>service docker start
------ 安装校验 ------
>docker version
启动并加入开机启动(非必须)
>systemctl start docker>systemctl enable docker
二、docker及Dockerfile常用命令
1、docker常用命令枚举
查询镜像
>docker search xxx
构建镜像(-t选项,用来指定镜像标签)
>docker build -t 仓库名称/镜像标签(:标签) Dockerfile的相对位置
样例:
>docker build -t nginx:my .
>docker build -t itmuch/app:0.0.1 .
>docker images -a ,即可查看刚刚构建的镜像
运行容器(-d表示后台运行;-p 宿主机端口:容器端口,表示将容器端口映射至宿主机;[name]:[version]启动容器的标识,其中:[version]非必填)
>docker run -d -p [hostPort]:[containerPort] [name]:[version]
样例:
>docker run -d -p 90:80 nginx
列出容器
>docker ps
停止容器
>docker stop [containerid]
启动已停止的容器
>docker start [containerid]
重启容器
>docker restart
删除容器
>docker rm xxx
进入容器(TODO)
>docker exec -it [containerid] /bin/sh #进入到容器里,再执行xxx命令
#>xxx
2、dockerfile常用命令
(1)From
DockerFile第一条必须为From指令。如果同一个DockerFile创建多个镜像时,可使用多个From指令(每个镜像一次)
(2)MAINTAINER
格式为maintainer ,指定维护者的信息
(3)RUN
格式为Run 或者Run [“executable” ,”Param1”, “param2”] 前者在shell终端上运行,即/bin/sh -C,后者使用exec运行。例如:RUN [“/bin/bash”, “-c”,”echo hello”] 每条run指令在当前基础镜像执行,并且提交新镜像。当命令比较长时,可以使用“/”换行。
(4)CMD
支持三种格式: CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐 CMD command param1 param2,在/bin/sh上执行 CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。每个容器只能执行一条CMD命令,多个CMD命令时,只最后一条被执行。
(5)EXPOSE
格式为 EXPOSE […] 告诉Docker服务端容器暴露的端口号,供互联系统使用。在启动Docker时,可以通过-P,主机会自动分配一个端口号转发到指定的端口。使用-P,则可以具体指定哪个本地端口映射过来例如: EXPOSE 22 80 8443
(6)ENV
格式为 ENV 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。ENV PG_MAJOR 9.3ENV PG_VERSION 9.3.4RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH1234
(7)ADD
格式为 ADD 该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)
(8)COPY
格式为 COPY 复制本地主机的 (为Dockerfile所在目录的相对路径)到容器中的 。当使用本地目录为源目录时,推荐使用 COPY
(9)ENTRYPOINT
两种格式:ENTRYPOINT [“executable”, “param1”, “param2”] ENTRYPOINT command param1 param2 (shell中执行)。 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个Dockerfile中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。
(10)VOLUME
格式为 VOLUME [“/data”] 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
(11)USER
格式为 USER daemon 指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。
(12)WORKDIR
格式为 WORKDIR /path/to/workdir 为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如WORKDIR /a WORKDIR b WORKDIR c RUN pwd 则最终路径为 /a/b/c 。
(13)ONBUILD
格式为 ONBUILD [INSTRUCTION] 配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。例如,Dockerfile使用如下的内容创建了镜像 image-A 。[…] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build –dir /app/src […] 如果基于A创建新的镜像时,新的Dockerfile中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。FROM image-A#Automatically run the followingADD . /app/srcRUN /usr/local/bin/python-build --dir /app/src使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild 。1234567
3、基础镜像制作(TODO)
a.第一种方式(手动修改容器镜像)
b.第二种方式(推荐:利用Dockerfile文件)
三、docker使用Demo
1、----------------样例1:简易打包运行nginx镜像---------------
a. 新建Dockerfile文件
FROM nginx
RUN echo '<h1>Spring Cloud与Docker微服务实战</h1>' > /usr/share/nginx/html/index.html
b. 构建镜像
>docker build -t nginx:my .
c. 启动docker容器
>docker run -p 92:80 -d nginx:my
d.宿主机访问
curl 127.0.0.1:92
e.关掉docker容器
>docker ps |grep nginx:my
>docker stop xxx
2、----------------样例2:简易打包运行java镜像---------------
a. 新建Dockerfile文件
#基于jdk8的镜像
FROM lwieske/java-8
#复制文件到容器
ADD springbootDemo-0.0.1-SNAPSHOT.jar /app.jar
#声明暴露接口
EXPOSE 6661
#配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
b. 构建镜像
>docker build -t app:0.0.1 .
c. 启动docker容器
>docker run -p 6661:6661 -d app:0.0.1
d.访问测试,查询容器id,关闭容器
(文字略,详见截图)
3、----------------样例3:高级打包运行java镜像---------------
a. 新建Dockerfile文件
#基于jdk8的镜像
FROM lwieske/java-8
#设置时区
#复制文件到容器
ADD frame-config-center.jar /java/app.jar
ADD lib /java/lib
#声明暴露接口
EXPOSE 8680
#配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/java/app.jar"]
b. 构建镜像
>docker build -t config:frame .
c. 启动docker容器(注意,通过-v 挂载本地盘,用于写日志)
>docker run -p 8680:8680 -d -v /data/logs/frame-config-center:/data/logs/frame-config-center config:frame
d.访问测试,日志文件查看,关闭容器
四、异常处理
1、docker build 镜像出现 error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net报超时的问题
原因分析:
问题原因为国内网络问题,无法连接到 docker hub,国内已经有 daocloud,docker指定该源即可
配置操作:
修改Docker配置文件/etc/default/docker如下:
DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"
使用service docker restart重启Docker服务即可。
2、容器中时区异常(TODO)
原因分析:
一台宿主机可以有多个docker容器,宿主机的时间可能会和容器时间不一致,主要是因为宿主机设置了时区,但是Docker容器并没有设置,这才导致它们时间不同步。
解决方法:把时区设置加入到Dockerfile中(尝试失败)
# CentOS的处理方式
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
不同的linux版会有所不同
可以考虑直接做一个时区正确的docker镜像
3、容器中文字符串异常(TODO)
五、Compose编排
1、定义
compose是一个用于定义和运行多容器Docker应用程序的工具
2、安装服务
a.自动下载并安装适应系统版本compose
#>sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
b.为安装脚本添加执行权限
#>sudo chmod +x /usr/local/bin/docker-compose
c.安装完成,测试安装结果
#>docker-compose --version输出结果:docker-compose version 1.21.2, build 1719ceb
3、基本步骤
a.使用Dockerfile定义应用程序环境,以便在任何地方重现该环境
b.在docker-compose.yml文件中定义组成应用程序的服务,以便各服务在一个隔离的环境中一起运行
c.执行命令#>docker-compose up -d,后台启动并运行整个应用程序
d.检查运行结果 http://宿主机ip:8761
4、使用Demo
a.编写Dockerfile
#基于jdk8的镜像
FROM lwieske/java-8
#复制文件到容器
ADD eureka-demo.jar /app.jar
#声明暴露接口
EXPOSE 8671
#配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
|
b.编写docker-compose.yml
eureka-server:
#image: eureka-demo:0.0.1
build: .
hostname: eureka-server
ports:
- "8761:8761"
|
c.执行docker-compose命令
#>docker-compose up -d
d.检查结果http://宿主机ip:8761
5、compose常用命令
基本的使用格式是
docker-compose [options] [COMMAND] [ARGS...]
选项
- --verbose 输出更多调试信息。
- --version 打印版本并退出。
- -f, --file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml。
- -p, --project-name NAME 指定项目名称,默认使用目录名称。
【最常用】
up
构建,(重新)创建,启动,链接一个服务相关的容器。
链接的服务都将会启动,除非他们已经运行。
默认情况, docker-compose up 将会整合所有容器的输出,并且退出时,所有容器将会停止。
如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。
默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持使用 volumes-from挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up --no-recreate。如果需要的话,这样将会启动已经停止的容器。
ps
列出所有容器。
logs
查看服务的输出。
port
打印绑定的公共端口。
stop
停止一个已经运行的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
start
启动一个已经存在的服务容器。
【其他】
build
构建或重新构建服务。
服务一旦构建后,将会带上一个标记名,例如 web_db。
可以随时在项目目录下运行 docker-compose build 来重新构建服务。
help
获得一个命令的帮助。
kill
通过发送 SIGKILL 信号来强制停止服务容器。支持通过参数来指定发送的信号,例如
$ docker-compose kill -s SIGINT
pull
拉取服务镜像。
rm
删除停止的服务容器。
run
在一个服务上执行一个命令。
例如:
$ docker-compose run ubuntu ping docker.com
将会启动一个 ubuntu 服务,执行 ping docker.com 命令。
默认情况下,所有关联的服务将会自动被启动,除非这些服务已经在运行中。
该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照期望创建。
两个不同点:
- 给定命令将会覆盖原有的自动运行命令;
- 不会自动创建端口,以避免冲突。
如果不希望自动启动关联的容器,可以使用 --no-deps 选项,例如
$ docker-compose run --no-deps web python manage.py shell
将不会启动 web 容器所关联的其它容器。
scale
设置同一个服务运行的容器个数。
通过 service=num 的参数来设置数量。例如:
$ docker-compose scale web=2 worker=3