1.设置docker加速、运行http访问、远程访问
Docker 安装成功之后,我们首先需要修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,加入如下内容:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
编辑配置 /etc/docker/daemon.json
https://docker.mirrors.ustc.edu.cn 是中国科学技术大学的docker仓库加速器,好像是实时代理的,但是时好时坏,生产环境一定要加 graph 选项,指定 docker 镜像和日志的目录为大空间的目录。启用 live-restore 设置来保持容器当 daemon 变为不可用时继续运行,默认是关闭的。
{
"registry-mirrors": ["http://hub-mirror.c.163.com", "https://pee6w651.mirror.aliyuncs.com"]
"graph": "/opt/data/docker",
"live-restore": true
}
设置运行http访问,docker 1.3.0 后面默认https,没办法虚拟机跑就很烦,换为自己的 ip 端口
{"insecure-registries":["192.168.85.128:5000"]}
重载配置,重启
systemctl daemon-reload
systemctl restart docker
2.搭建私服
使用 nexus3.x 比较方便
docker run -d --name nexus3 --restart=always -p 8081:8081 -p 8082:8082 -p 8083:8083 -p 8084:8084 --mount src=nexus-data,target=/nexus-data aab1398bb647
再修改http可以访问。
2.镜像操作
查看本地镜像: docker images
查找仓库镜像: docker search
[name]
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
镜像仓库用户名/镜像名称 | 镜像版本标签 latest表示最新版 | 镜像唯一ID | 创建时间 | 镜像文件大小 |
docker.io | docker.io/nginx | Official build of Nginx. | 14378 | [OK] |
获取仓库镜像: docker pull
[镜像名称:版本]
创建镜像标签: docker tag
[镜像ID/镜像名称] [Tag内容]
删除镜像: docker rmi
[镜像名称/镜像ID/镜像Tag标签]
如有运行容器,可以强制删除: docker rmi -f
[镜像名称/镜像ID/镜像Tag标签]
3.容器操作
创建容器: docker create -p 3000:80 --name mynginx docker.io/nginx
-p 3000: 80 宿主机 3000 端口映射容器 80 端口
--name
指定名称
查询容器: docker ps -a
全量查询:docker ps --no-trunc
删除容器: docker rm [name]
删除容器并且显示删除映射的数据卷: docker rm -v [name]
删除所有停止的容器: docker rm $(docker ps -a -q)
进入容器交互模式的终端: docker exec -it mynginx [/bin/sh|bash]
[command]
- -d :分离模式: 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
启停容器: docker start/stop/restart
container_name/container_id
查看容器运行日志: docker logs
container_name/container_id
查看容器数据卷映射:
docker inspect -f {{.Mounts}} mynginx
容器导入导出
export
Usage: docker export [OPTIONS] CONTAINER
Export a container's filesystem as a tar archive
Options: -o, --output string Write to a file, instead of STD
docker export -o mynginx.tar ecc7500d8f2e
import
Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Import the contents from a tarball to create a filesystem image
docker import mynginx.tar nginx/mynginx:v1
执行导入的镜像报错 docker: Error response from daemon: No command specified.
解决:查看导出的容器运行的命令,追加到运行命令后面即可。使用命令
docker ps --no-trunc
可以查看完整的容器运行命令。最终运行命令docker run --name nginx01 -d -v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/log/nginx:/var/log/nginx -p 8090:80 c07e13de2ee4 /docker-entrypoint.sh nginx -g 'daemon off;'
4.容器运行
可以直接创建容器并运行 docker run [image]
docker run
--name nginx
-d
-v /data/nginx/html:/usr/share/nginx/html
-v /data/nginx/log/nginx:/var/log/nginx
-p 8080:80
nginx
--rm
停止就删除掉
-d
后台运行
--name
指定容器名称
-v
数据卷挂载目录: [宿主机目录:容器目录]
容器目录不存在会自动创建,映射目录会自动双向同步。创建数据卷 -v [数据卷名称]
-p
端口映射:[宿主机端口:容器端口]
-P
随机端口
--privileged=true
使用该参数,容器内的root拥有真正的root权限.否则,容器内的root只是外部的一个普通用户权限。
--restart=awaly
随着容器重启,除非手动关掉了
更新容器参数
要为容器配置重启策略,请在使用 docker run 命令时使用 --restart 标志。--restart 标志的值可以是以下任何一种:
no
不要自动重启容器。(默认)
on-failure
如果容器因错误退出,则重新启动容器,这表现为非零退出代码。
always
如果容器停止,请始终重新启动容器。如果是手动停止的,只有在 Docker daemon 重启或者容器本身手动重启时才会重启。
unless-stopped
与 类似always
,除了当容器停止(手动或其他方式)时,即使在 Docker 守护进程重新启动后也不会重新启动。
以下示例启动 Redis 容器并将其配置为始终重新启动,除非它被显式停止或 Docker 重新启动。
$ docker run -d --restart unless-stopped redis
此命令更改已在运行的名为 redis 的容器的重启策略。
$ docker update --restart unless-stopped redis
此命令将确保所有当前正在运行的容器将重新启动,除非停止。
$ docker update --restart unless-stopped $(docker ps -q)
5.文件拷贝
从主机复制到容器 sudo docker cp host_path containerID:container_path
从容器复制到主机 sudo docker cp containerID:container_path host_path
6.数据卷容器
数据卷容器(Data Volume Containers):使用特定容器维护数据卷。从名称上可以看出数据卷容器本质上是一个容器,只不过这个容器专门提供数据卷给其他容器使用,即可以实现不同容器之间数据的同步。
创建数据卷容器,注意 bash 形式是直接运行,exit 就退出了。
docker run -it --name test -v /data nginx bash
然后创建使用数据卷容器的容器。
命令格式:docker run [容器启动参数] --volumes-from [数据卷容器名称] --name [当前容器名称] [当前容器镜像] [bash]
docker run -it --volumes-from test --name test1 nginx bash
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v
命令来指定同时删除关联的容器。
数据卷迁移
- 备份
命令:docker run --volumes-from [要备份的数据卷容器名称] -v [宿主机目录]:[当前容器数据卷目录] --name [当前容器名称] --privileged=true [当前容器镜像] tar -cvPf [备份文件保存的目录] [需要备份的数据卷]
docker run --volumes-from test -v $(pwd):/backup --name test3 nginx tar -cvPf /backup/backup.tar /data
上述命令表示新运行一个容器,使用 test 数据卷容器,同时映射当前目录 (/data/backup) 到容器里面 /backup 目录,--name 容器命名为 test3,使用 nginx 镜像,执行打包操作 -P 参数表示使用绝对路径,生成 /backup/backup.tar 压缩包,备份数据卷 /data 目录。
恢复
解压对应的 tar 包,tar -xvPf backup.tar 解压完成把解压文件放到对应的共享数据卷里面即可。
7.容器端口通讯
容器端口已经被映射了,不同容器直接想要通讯
8.Dockerfile
Dockerfile用大白话解释就是一个配置文件,里面有各种命令,可用来构建自定义Docker镜像。作用好比如Maven的pom文件一样,可依据设置的指令执行相关的动作。
部分 | 命令 |
---|---|
基础镜像信息 | FROM |
标签、维护者信息 | LABEL、MAINTAINER |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
命令详解
FROM
指定基础镜像,如 FROM java:8
LABEL
设置标签信息,可用来设置自定义镜像的一些基本信息等
LABEL version="1.0"
LABEL description="this is a SpringBoot app"
MAINTAINER
设置作者信息
MAINTAINER linqin woshilinqin163@163.com
RUN
在镜像内部执行的命令,可用来执行一些配置、设置环境、设置域名等
RUN echo 'this is a restful app!' > README.txt
RUN echo "172.31.3.25 autoconf.openspeech.cn" >> /etc/hosts
COPY
将所在主机中的文件复制到容器内,比如我们需要运行某个Java应用,那么在生成自定义镜像的时候得先将,这个应用文件集成到镜像中
如果是目录,复制
目录里面的内容
到容器,如果容器目录不存在会自动创建
。COPY vpa-page /usr/share/nginx/html/vpa-page
ADD
使用和作用同COPY,但是不同的地方在于ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作
EXPOSE
暴露镜像端口,需要注意的是这边暴露的端口并不意味着在宿主机中可以直接根据这个端口访问,同样的需要在容器启动的时候通过
-p
参数设置宿主机端口映射,或者-P
随机端口映射EXPOSE $POSR
WORKDIR
指定工作目录,后续命令操作都是基于此目录
WORKDIR $WOEK_DIR
USER
指定容器启动后以哪个用户身份去运行
USER ROOT
VOLUME
挂载容器数据卷,即将宿主机器某个目录和容器中某个目录进行映射,主要用来存放数据。
添加数据卷,注意这里是无法指定宿主机器目录的。这里设置容器中当前工作目录下的 log 目录为数据卷,那么后期容器实际运行的时候这个下面的文件会实时同步到对应的随机分配的宿主机映射目录中。
VOLUME $WORK_DIR/log
CMD | ENTRYPOINT
容器启动的时候执行的命令,相当于在定义镜像的时候就约定好了运行容器后执行的命令,当有多个CMD的时候,只有最后一个生效。用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令,ENTRYPOINT 不会覆盖。
CMD java -jar $WORK_DIR/xxx.jar
案例:
新建dockerfile文件:touch dockerfile 、vim dockerfile,注意文件名称必须是dockerfile
#Dockerfile文件:自定义 Docker 镜像文件
#声明需要用到的基础镜像
FROM java:8
#声明基础信息
LABEL version="1.0"
LABEL description="This is a SpringBoot test app"
#声明作者信息
MAINTAINER linqin linqin_07@aliyun.com
#声明环境变量
ENV WORK_DIR=/app PORT=8080
#声明工作目录
WORKDIR $WORK_DIR
#在镜像内部执行一些配置命令
RUN echo 'This is a test app !'> README.txt
#将要运行的Java应用复制到镜像内
COPY spring-boot-test-0.0.1-SNAPSHOT.jar $WORK_DIR/spring-boot-test-0.0.1-SNAPSHOT.jar
#暴露镜像端口:这里为应用的访问端口
EXPOSE $PORT
#添加数据卷:这里将日志文件目录添加为数据卷(注意是无法指定宿主机目录的)
VOLUME $WORK_DIR/logs
#设置容器启动命令:即启动Java应用
CMD java -jar $WORK_DIR/spring-boot-test-0.0.1-SNAPSHOT.jar
执行命令生成镜像 -f 命令指定使用其他目录 Dockerfile docker build -t name:tag .
执行生成镜像命令
docker build -t spring-boot-test.jar .
Sending build context to Docker daemon 1.379GB
Step 1/11 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
---> d23bdf5b1b1b
Step 2/11 : LABEL version="1.0"
---> Running in fd6007d24044
Removing intermediate container fd6007d24044
---> 5743ec2d1bb3
Step 3/11 : LABEL description="This is a SpringBoot test app"
---> Running in ff5c1a782b17
Removing intermediate container ff5c1a782b17
---> d96ea2194e36
Step 4/11 : MAINTAINER linqin linqin_07@aliyun.com
---> Running in b88acdfff8d8
Removing intermediate container b88acdfff8d8
---> 71ec80304a33
Step 5/11 : ENV WORK_DIR=/app PORT=8080
---> Running in 7c19d3083dff
Removing intermediate container 7c19d3083dff
---> 09139b9a3b5f
Step 6/11 : WORKDIR $WORK_DIR
---> Running in 5ec9bafe6203
Removing intermediate container 5ec9bafe6203
---> fca757b40019
Step 7/11 : RUN echo 'This is a test app !'> README.txt
---> Running in d0da4bde9edf
Removing intermediate container d0da4bde9edf
---> 5d4cf880d3fa
Step 8/11 : COPY spring-boot-test-0.0.1-SNAPSHOT.jar $WORK_DIR/spring-boot-test-0.0.1-SNAPSHOT.jar
---> f9621fe4ca36
Step 9/11 : EXPOSE $PORT
---> Running in a5f6010b1f0f
Removing intermediate container a5f6010b1f0f
---> a1606933767d
Step 10/11 : VOLUME $WORK_DIR/logs
---> Running in c2909474a96b
Removing intermediate container c2909474a96b
---> d04bf50acb7f
Step 11/11 : CMD java -jar $WORK_DIR/spring-boot-test-0.0.1-SNAPSHOT.jar
---> Running in 569f354af7e8
Removing intermediate container 569f354af7e8
---> f92d928f8145
Successfully built f92d928f8145
Successfully tagged spring-boot-test.jar:latest
这样生成的镜像就可以使用docker images
查看
运行该镜像
个人理解
docker 有点是可以很快速的启动一些应用,不用担心环境问题。但是具体使用时尽量避免映射过多的路径,这样就失去了 docker 的本意,可以采取进入容器的方式进行管理。缺点是如果要具体对应用进行调优,这将是非常麻烦的事情。
but,集成k8s后,真香!!!
docker-compose
作用容器编排
安装
若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加可执行权限 sudo chmod +x /usr/local/bin/docker-compose 测试安装结果 $ docker-compose -v
docker-compose常用命令
- 1、docker-compose ps 查询当前启动的服务
- 2、docker-compose up -d [service] 启动编排号的服务
- 3、docker-compose stop [service] 停止服务
- 4、docker-compose restart [service] 重启服务
- 5、docker-compose rm 删除服务容器
- 6、【-f docker-compose-*.yml】指定自定义的yml文件例如,docker-compose -f docker-compose-1.yml up -d 启动docker-compose-1.yml
- 7.删除service[同时会删除掉network和volume] docker-compose down
- 进入到某个service,bash更好用 docker-compose exec [service] [sh|bash]
新建文件 docker-compose.yml
默认在这个文件下面执行命令,否则需要 -f
参数指定
version: '3'
services:
vpa-eureka-server:
image: java
restart: "always" #重启策略,能够使服务保持始终运行,生产环境推荐使用
container_name: ${env}-vpa-eureka-server #容器名称
volumes:
- /opt/vpa/jar/vpa-eureka-server-0.0.1-SNAPSHOT.jar:/usr/vpa-eureka-server.jar
network_mode: "host"
ports:
- 8761:8761
entrypoint: java -jar -Xms1g -Xmx1g /usr/vpa-eureka-server.jar --spring.profiles.active=${env}
environment:
- TZ=Asia/Shanghai
labels:
- "servicename=vpa-eureka-server" #设置名称,默认是容器名称