环境搭建及安装
Centos7.0
[root@localhost sysconfig]# yum install docker
安装完成以后,启动可能会报以下错误
[root@localhost docker]# service docker start
Redirecting to /bin/systemctl start docker.service
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
通过命令systemctl status docker查看日志
[root@localhost docker]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 五 2019-05-17 17:15:40 CST; 2min 42s ago
Docs: http://docs.docker.com
Process: 4046 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
Main PID: 4046 (code=exited, status=1/FAILURE)
5月 17 17:15:38 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
5月 17 17:15:38 localhost.localdomain dockerd-current[4046]: time="2019-05-17T17:15:38.880925658+08:00" l...d"
5月 17 17:15:38 localhost.localdomain dockerd-current[4046]: time="2019-05-17T17:15:38.891456871+08:00" l...1"
5月 17 17:15:39 localhost.localdomain dockerd-current[4046]: time="2019-05-17T17:15:39.923455549+08:00" lev...
5月 17 17:15:40 localhost.localdomain dockerd-current[4046]: Error starting daemon: SELinux is not suppor...e)
5月 17 17:15:40 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, stat...URE
5月 17 17:15:40 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
5月 17 17:15:40 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
5月 17 17:15:40 localhost.localdomain systemd[1]: docker.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
重点在如下这一行Error starting daemon: SELinux is not suppor,表示此linux的内核中的SELinux不支持 overlay2 graph driver ,解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,--selinux-enabled=false
[root@localhost docker]# vi /etc/sysconfig/docker
重新执行命令systemctl start docker
验证docker是否启动成功
[root@localhost sysconfig]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Wed May 1 14:55:20 2019
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Wed May 1 14:55:20 2019
OS/Arch: linux/amd64
Experimental: false
Docker指令
- 启动docker: systemctl start docker
- 停止docker: systemctl stop docker
- 重启docker: systemctl restart docker
- 查看docker状态:systemctl status docker
- 开机启动:systemctl enable docker
- 查看docker概要信息:docker info
- 查看docker总体帮助文档:docker --help
IDEA连接Docker
1、编辑docker服务vim /usr/lib/systemd/system/docker.service,添加如下内容
-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
2、IDEA安装Docker插件
3、配置Docker信息
IDEA打包镜像
1、在pom下新增插件docker-maven-plugin:1.0.0
com.spotify
docker-maven-plugin
1.0.0
http://IP:2375
xpz/${project.artifactId}
src/main/docker
/
${project.build.directory}
${project.build.finalName}.jar
2、在右侧通过命令docker:build即可构建镜像并上传到服务器,前提是IDEA已经连接到Docker服务器
镜像
- docker pull NAME[:TAG]:下载镜像,默认从Docker Hub仓库中下载,也可以指定仓库,如从dl.dockerpool.com中下载,docker pull dl.dockerpool.com:5000/NAME[:TAG]
- docker images:查看镜像
- docker inspect:查看镜像的详细信息
- docker tag OLD_NAME NEW_NAME:给本地镜像添加新的标签,新的标签镜像跟原来的镜像具有相同的镜像ID
- docker search:搜索远程仓库中共享的镜像
- --automated=false 仅显示自动创建的镜像
- --no-trunc=false 输出信息不截断显示
- --stars=0 指定仅显示评价为指定星际以上的镜像
- docker rmi IMAGE:删除镜像,删除时要先删除由该镜像产生的容器
- docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]:基于已有镜像的容器创建新的镜像
- -a 作者信息
- -m 提交信息
- -p 提交时暂停容器运行
- docker save -o NEW_NAME IMAGE[:TAG]:存出镜像,NEW_NAME一般为tar格式的压缩包
- docker load --input NEW_NAME:载入镜像
- docker push NAME[:TAG]:上传镜像,第一次上传时,会提示输入账号信息
容器
- docker create [OPTIONS] IMAGE[:TAG]:根据镜像创建容器
- docker start CONTAINER_ID:启动容器
- docker run [OPTIONS] IMAGE:创建并启动容器
- -d 让容器在后台以守护态形式运行
- docker logs CONTAINER_ID:获取容器的输出信息
- docker stop CONTAINER_ID:停止容器
- docker restart CONTAINER_ID:重启容器
- docker rm [OPTIONS] CONTAINER_ID:删除容器
- -f 强行终止并删除一个运行中的容器
- -l 删除容器的连接,但保留容器
- -v 删除容器挂载的数据卷
- docker exec:进入容器并执行命令
- docker export CONTAINER_ID > NEW_NAME:导出容器到文件,NEW_NAME一般为tar格式的压缩包
- docker import:导入容器,成为镜像
仓库
- docker run -d -p 5000:5000 registry:通过官方registry镜像搭建本地私有仓库,监听端口为5000
Dockerfile
dockerfile使用#开头的注释行,第一行必须指定基于的基础镜像
指令
- FROM ::指定基础镜像
- MAINTAINER :指定维护者信息
- RUN:将在当前镜像基础数执行指定命令,并提交为新的镜像
- 将在shell终端中运行命令
- ["executable", "param1", "param2"] 使用exec执行,指定使用其它终端执行命令,例如RUN ["/bin/bash","-c","echo hello"]
- CMD:指定启动容器时执行的命令,每个dockerfile只能有一条CMD命令。如果指定了多条,只有最后一条会被执行
- ["executable", "param1", "param2"] 使用exec执行,推荐
- param1 param2 在/bin/sh中执行
- ["param1","param2"] 提供给ENTRYPOINT的默认参数
- EXPOSE :告诉Docker服务端容器暴露的端口号
- ENV :指定环境变量,供RUN指令使用,使用时通过$引用
- ADD :复制指定的src到容器中的dest,src可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件
- COPY :复制本地主机的src为容器中的dest,目标路径不存在时,会自动创建
- ENTRYPOINT:配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖,每个Dockerfile中只能有一个ENTRYPOINT,如果指定了多个,只有最后一个生效
- ["executable", "param1", "param2"] 使用exec执行,推荐
- 将在shell终端中运行命令
- VOLUME ["/data"]:创建一个可以从本地主机或其它容器挂载的挂载点,一般用来存放数据库和需要保持的数据
- USER :指定运行容器时的用户名或UID,后续的RUN也会使用指定用户
- WORKDIR :为后续的RUN、CMD、ENTRYPOINT指令配置工作目录
- ONBUILD [INSTRUCTION]:配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
- docker build:根据dockerfile文件创建镜像
示例
# 指定基础镜像
FROM openjdk:8-jdk-alpine
# 指定维护者信息
MAINTAINER Jacky
# 添加jar包到镜像并重新命名
ADD *.jar im.jar
# 挂载目录,指在容器中指定一个目录,用来供容器启动时方便宿主机挂载
VOLUME ["/logs"]
# 镜像启动后暴露的端口
EXPOSE 9830
# 容器启动执行运行jar指令
ENTRYPOINT ["java", "-jar", "im.jar"]
将jar包和Dockfile文件放在同一目录下,通过命令docker build构建为镜像
# docker build -t imageName:tagName dir
# -t:给镜像加一个Tag
# imageName:镜像名称
# tagName:镜像Tag名称
# dir:Dockerfile文件所在目录,如果是当前目录,可以用.表示
docker build -t im:1.0.0 .
docker-compose
#指定Docker Compose的版本号,通常是3, 第一行显示
version: '3'
services:
mysql:
#定义镜像
image: mysql:latest
#指定Dockerfile所在目录,自动构建镜像,这是在没有镜像,需要构建镜像的情况下使用
build: ./dir
#自定义容器名称
container_name: mysql
#设置这个可以 springboot yml文件可以读取这里的值
environment:
- TZ=Asia/Shanghai
#输出文件到宿主机目录 前面是宿主机目录。
volumes:
- ./logs/data:/logs
#指定端口号
ports:
- "3306:3306"
#指定网络连接方式
networks:
- spring-boot-net
#docker 重启 容器也会重启
restart: always
hello:
image: hello:dev
environment:
- TZ=Asia/Shanghai
volumes:
- ./logs/hello:/logs
ports:
- "8080:8080"
#前置服务,通过该指令决定启动的先后顺序
depends_on:
- mysql
links:
- mysql
networks:
- spring-boot-net
restart : always
#设置容器启动后默认执行的命令
command: sh -c '/./wait-for-it.sh test:8081 -t 0
# privileged: true
# 配置网络连接方式,默认bridge(桥接)
networks:
spring-boot-net:
driver: bridge
docker-compose常用指令
# 1. 基于docker-compose.yml启动管理的容器
docker-compose up -d
# 2. 关闭并删除容器
docker-compose down
# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart
# 4. 查看由docker-compose管理的容器
docker-compose ps
# 5. 查看日志
docker-compose logs -f
镜像推荐
- portainer:可视化管理镜像及容器应用
- 启动命令:docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer