Docker的安装使用与程序的部署

347 阅读6分钟

@[toc]

docker安装

安装要求

#查看当前系统内核版本(要内核版本高于3.10)
uname -r
#查看CentOS版本(要版本高于7)
cat /etc/redhat-release

Docker安装

#1. 卸载老版本的 docker 及其相关依赖
yum remove docker docker-common container-selinux docker-selinux docker-engine
#2. 更新yum
yum update
#3. ​安装 yum-utils,它提供了 yum-config-manager,可用来管理yum源
yum install -y yum-utils
#4. 添加yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#5. 更新索引
yum makecache fast
#6. 安装 docker
yum install -y docker-ce docker-ce-cli containerd.io
#7.启动docker
systemctl start docker

卸载Docker(了解)

yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

配置镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://eekuwuxe.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker命令

#启动docker服务
systemctl start docker.service
#设置docker开机自启动
systemctl enable docker
#查看版本号
docker version  
#更详细的版本信息
docker info  
docker --help
#查看所有docker网络
docker network ls

docker操作镜像

#常用命令
docker pull 镜像名 #拉取镜像
docker rmi 镜像名(或id)  #删除镜像
docker run [options] IMAGE [command][arg...] #启动容器
docker commit -m '提交的描述信息' -a '作者' 容器ID 要创建的目标镜像名:[标签名]
docker build -t 新镜像名字:TAG . #构建镜像

#列出镜像
docker images 
docker images -a  #列出本地所有的镜像(汉中间映像层)
docker images -q  #只显示列出镜像的id
docker images --digests  #显示镜像的摘要信息
docker images --no-trunc  #显示完整的镜像信息

#查询镜像
docker search 镜像名  #去hub.docker.com查找镜像
docker search -s 40 镜像名  #列出收藏数不小于指定值的镜像
docker serach 镜像名 --automated   #只列出automated build(自动构建)类型的镜像

#删除镜像
docker rmi 镜像名(或id)  #删除镜像
docker rmi -f 镜像名(或id):TAG  #强制删除镜像
docker rmi -f $(docker images -qa)  #删除全部镜像
docker image prune #删除虚悬镜像

docker run [options] IMAGE [command][arg...] #启动容器
	--name '新容器名字' #为容器指定一个名称
	--restart=always #让容器自启动
	-d  #后台运行容器,并返回容器ID,也就是启动守护式容器
	-i  #以交互模式运行容器,通常与-t同时使用
	-t  #为容器重新分配一个伪输入终端,通常与-i同时使用
	-P  #随机端口映射
	-p #指定端口映射,有以下四种格式
		ip:hostPort:containerPort
		ip::containerPort
		hostPost:containerPort
		containerPort
		
#如果创建时未指定 --restart=always ,可通过update 命令设置
docker update --restart=always xxx

docker操作容器

#列出容器
docker ps #列出当前正在运行的容器
	-a  #列出当前所有正在运行的容器和历史上运行过的容器
	-l  #显示最近创建的容器
	-n 2  #显示最近n个创建的容器
	-q  #静默模式,只显示容器编号
	--no-trunc  #不截断输出
#退出容器
exit  #容器停止退出
ctrl+p+q  #容器不停止退出

#删除容器
docker rm container  #删除容器
docker rm -f container   #强制删除容器
docker rm container1 container2 ...  #删除多个容器
docker rm -f $(docker ps -a -q)    #一次性删除多个容器
docker ps -a -q | xargs docker rm  #一次性删除多个容器

#操作容器 container(指代容器ID或容器名)
docker restart container  #重启容器
docker stop container  #停止容器
docker kill container  #强制停止容器
docker run -d container  #启动守护式容器
docker logs -f -t --tail container  #查看容器日志
	-t  #加入时间戳
	-f  #跟随最新的日志
	--tail 5  #显示最后多少条
docker top container  #查看容器内运行的进程
docker inspect container  #查看容器内部细节(以json形式)
docker exec -it container bash  #重新进入容器(打开新的终端)
docker exec -it container sh #如果以上命令报 OCI runtime exec failed: exec failed 使用该命令
docker attach container  #重新进入容器(直接进入容器)
docker cp container:容器内路径 目的主机路径  #从容器内复制文件到主机

docker 追加容器端口映射

  1. 获取容器的 ID
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
9d673f254336        nginx               "nginx -g 'daemon of…"   25 hours ago        Up 21 hours         0.0.0.0:80->80/tcp   nginx
  1. 停止所有容器
[root@localhost ~]# docker stop nginx
nginx
  1. 停止docker服务
systemctl stop docker
  1. 修改文件
#这里的 container_id 是以第一步获取到的 9d673f254336 开头的文件夹
vim   /var/lib/docker/containers/{container_id}/hostconfig.json

找到 这个 PortBindings 值。在这个json集合里边追加新端口

{
	...
    "PortBindings": {
        "80/tcp": [
            {
                "HostIp": "",
                "HostPort": "80"
            }
        ],
        "81/tcp": [
            {
                "HostIp": "",
                "HostPort": "81"
            }
        ]
    },
    ...
}

如果 config.v2.json 里面也记录了端口,也要修改 修改 Config => ExposedPorts 和 NetworkSettings => Ports

{
    ...
    "Config": {
        ...
        "ExposedPorts": {
            "80/tcp": {},
            "81/tcp": {}
        },
       ...
    },
    "Image": "sha256:6678c7c2e56c970388f8d5a398aa30f2ab60e85f20165e101053c3d3a11e6663",
    "NetworkSettings": {
        ...
        "Ports": null, //如果为 null 则不用修改
        ...
    },
    ...
}
  1. 启动docker服务
systemctl start docker
  1. 启动容器
docker start nginx

启动后就可以看到多了个端口

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                    NAMES
9d673f254336        nginx               "nginx -g 'daemon of…"   25 hours ago        Up 18 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:81->81/tcp   nginx

docker数据卷

#数据卷命令
docker run -it -v/主机绝对路径目录:/容器内目录 镜像名   #设置主机和容器的共享文件夹
docker inspect 容器ID  #查看数据卷是否挂载成功
docker run -it -v/主机绝对路径目录:/容器内目录 :ro 镜像名  #设置权限 
#数据卷容器命令
#1.启动一个父容器dc01 创建文件夹dataVolumeContainer
#2.创建dc02继承dc01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos

DockerFile体系结构

保留字详解
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露出的端口
WORKDIR指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理RUL和解压tar压缩包
CPOY类似于ADD,拷贝文件和目录到镜像中
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令,最后的CMD指令会覆盖以前的指令
ENTRYPOINT指定一个容器启动时要运行的命令,不会覆盖以前的指令
ONBUILD当构建一个被继承的Dockerfile时运行命令,父镜像被子继承后onbuild会触发

DockerCompose

DockerCompose的安装

#下载docker-compose 二选一
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#修改权限
sudo chmod +x /usr/local/bin/docker-compose 
#查看版本信息
docker-compose --version 

DockerCompose命令

#在docker-compose.yml的目录中运行
docker-compose up -d  #以守护进程模式运行加-d选项
docker-compose ps #查询
docker-compose logs web #查看compose日志
docker-compose stop #停止compose服务
docker-compose restart #重启compose服务
docker-compose kill #kill compose服务
docker-compose rm #删除compose服务
docker-compose --help #更多的docker-compose命令

Docker-compose安装Tomcat

  1. 在指定位置建立tomcat文件夹
  2. 新建docker-compose.yml文件,填入以下内容
version: '3' #yml格式的版本号
services:  #当前docker-compose要编排哪些服务(要启动哪些服务)
    tomcat:  #具体要编排的服务
        restart: always #虚拟机重启后该服务器就会启动
        image: tomcat:latest #服务的镜像名
        container_name: tomcat #容器的名字
        ports: #映射的端口
          - 8080:8080
        volumes: #数据卷
          - ./webapps:/usr/local/tomcat/webapps
          - ./logs:/usr/local/tomcat/logs
          - ./conf:/usr/local/tomcat/conf
        environment: #环境参数
          TZ: Asia/Shanghai
  1. 按照以下步骤在当前tomcat目录下执行以下命令
#1.拉取镜像
docker pull tomcat
#2.运行容器
docker run --name tomcat -p 8080:8080 -d tomcat
#3.复制配置文件到宿主机
docker cp tomcat:/usr/local/tomcat/conf ./
#5.停止容器并删除
docker stop tomcat
docker rm tomcat
#6.重新运行容器
docker-compose up -d

Docker-compose安装Mysql

version: '3.1'
services:
  mysql:
    image: mysql:latest
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root #数据库密码,可自定义
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ./data:/var/lib/mysql

Docker-compose安装Redis

version: "3.1"
services:
  redis:
    image: redis:latest
    container_name: redis
    ports:
      - 6379:6379
    volumes:
      - ./conf:/usr/local/etc/redis
      - ./data:/data
    command: redis-server --requirepass 123456 #你的密码

Docker-compose安装 Zookeeper

单机版

version: '2'
services:
  zookeeper:
    image: zookeeper
    restart: always
    container_name: zookeeper
    volumes:
      - ./config:/conf
    ports: 
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1

集群版

version: '3'
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        volumes:
            - ./config:/conf
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

    zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        volumes:
            - ./config:/conf
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        volumes:
            - ./config:/conf
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

Docker-compose安装 RabbitMq

version: '3'
services:
  rabbitmq:
    image: rabbitmq:management-alpine
    container_name: rabbitmq
    environment:
      - RABBITMQ_DEFAULT_USER=xxx
      - RABBITMQ_DEFAULT_PASS=xxxxx
    restart: always
    ports:
      - "15672:15672"
      - "5672:5672"
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

Docker部署SpringBoot项目

编写Dockerfile文件

# Docker image for springboot file run
# VERSION 1.0.0
# Author: Manaphy
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER Manaphy <chengpass@gmail.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp 
# 将jar包添加到容器中并更名为app.jar
ADD hello.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

将 jar 包和 Dockerfile 文件放在同一个文件夹下,使用以下命令构建镜像

# -t 参数是指定此镜像的tag名
docker build -t springbootdemo4docker .

使用docker run -d -p 8080:8080 springbootdemo4docker启动项目

idea集成docker实现镜像打包一键部署

1. Docker开启远程访问

注:不要在服务器上开启远程访问,可在自己的虚拟机里开启测试

#修改docker服务文件
vim /lib/systemd/system/docker.service
#修改 ExecStart 开头的这行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock
#重新加载配置文件和启动
systemctl daemon-reload
systemctl start docker
#测试是否修改成功
curl http://localhost:2375/version

2.idea配置docker

高版本 idea 已经默认集成了 docker 插件 配置docker 在这里插入图片描述 配置镜像加速 在这里插入图片描述

3.修改springboot项目pom文件

<!--在properties 中添加 docker.image.prefix -->
<properties>
    <!--镜像名称前缀-->
    <docker.image.prefix>manaphy</docker.image.prefix>
</properties>

<!--在plugins 中添加以下信息 -->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <!--镜像名称-->
        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>

        <!--指定标签-->
        <imageTags>
            <imageTag>latest</imageTag>
        </imageTags>
        <!--基础镜像jdk 8-->
        <baseImage>java</baseImage>
        <!--制作者提供本人信息-->
        <maintainer>manaphy chengp@gmail.com</maintainer>
        <!--切换到/root目录 -这里是镜像内的路径-->
        <workdir>/ROOT</workdir>
        <cmd>["java","-version"]</cmd>
        <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
        <!--指定远程 docker api 地址-->
        <dockerHost>http://xxxxx:2375</dockerHost>

        <!--指定 Dockerfile 路径--><!--配置以上信息后就无需编写 Dockerfile -->
        <!--<dockerDirectory>${project.basedir}/src/main/java</dockerDirectory>-->

        <resources>
            <resource>
                <targetPath>/ROOT</targetPath>
                <!--用于指定需要复制的根目录,${project.build.directory}表示target目录-->
                <directory>${project.build.directory}</directory>
                <!--用于指定需要复制的文件.${project.build.finalName}.jar 指的是打包后的jar包文件-->
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
    <executions>
        <!--当执行mvn package 时,执行 mvn package docker:build-->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

4.执行构建

使用maven执行打包 在docker工具栏中找到刚上传的镜像 右键Create Containers Create... 在这里插入图片描述 点击运行,完成部署

docker 配合 nginx 部署 vue 项目

1.拉取 nginx 镜像 docker pull nginx 2.编写 Dockerfile 文件vim Dockerfile,写入以下内容

FROM nginx:latest
MAINTAINER Manaphy <chengpass@gmail.com>
COPY dist/ /usr/share/nginx/html/     

3.打包 vue 项目 npm install build 4.将dist文件夹和Dockerfile放在同一个目录下,构建项目

docker build -t docker4vue .

5.执行命令创建容器

docker run -d --name docker4vue -p 8888:80 docker4vue