@[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 追加容器端口映射
- 获取容器的 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
- 停止所有容器
[root@localhost ~]# docker stop nginx
nginx
- 停止docker服务
systemctl stop docker
- 修改文件
#这里的 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 则不用修改
...
},
...
}
- 启动docker服务
systemctl start docker
- 启动容器
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
- 在指定位置建立tomcat文件夹
- 新建
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
- 按照以下步骤在当前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