docker学习笔记
1 docker环境安装
1.1 安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
1.2 为yum源添加docker仓库位置
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.3 安装docker
yum install docker-ce
1.4 启动docker
systemctl start docker
2 docker镜像常用命令
2.1 搜索镜像
docker search mysql
2.2 查找镜像支持的版本
进入docker hub的官网,地址为:[https://hub.docker.com](https://hub.docker.com/),然后搜索需要的镜像


2.3 下载镜像
docker pull mysql:5.7
2.4 列出镜像
docker images
2.5 删除镜像
•指定名称删除镜像:
```bash docker rmi mysql:5.7 ```
•指定名称删除镜像(强制):
docker rmi -f mysql:5.7
•删除所有没有引用的镜像
docker rmi $(docker images | grep none | awk '{print $3}')
•强制删除所有的镜像
docker rmi -f $(docker images)
3 Docker容器常用命令
3.1 新建并启动容器
docker run -p 3306:3306 --name mysql -d mysql:5.7
参数解释
-p 指定端口映射,格式为:hostPort:containerPort
--name选项:指定运行后容器的名字为mysql,之后可以通过名字来操作容器
-d 表示后台运行
3.2 列出运行中的容器
docker ps
3.3 列出所有的容器
docker ps -a
3.4 停止容器
docker stop containerName(containerId)
例如:docker stop mysql or docker stop b417ac5a44b0
3.5 强制停止所有的容器
docker kill containerName(containerId)
例如:docker kill mysql or docker kill b417ac5a44b0
3.6 启动停止的容器
docker start containerName(container)
例如:docker start mysql docker start b417ac5a44b0
3.7 进入容器
•先查询出容器的pid
docker inspect --format "{{.State.Pid}}" $ContainerName(或者$ContainerId)
•根据容器的pid进入容器
nsenter --target 11239 --mount --uts --ipc --net --pid
3.8 删除容器
•删除指定容器
docker rm $ContainerName(或者$ContainerId)
•按名称删除容器
docker rm `docker ps -a | grep mysql* | awk '{print $1}'`
•强制删除所有的容器
docker rm -f $(docker ps -a -q)
3.9 查看容器的日志
•查看当前容器日志
docker logs containerName(containerId)
•动态查看当前容器日志
docker logs containerName(containerId) -f
4.0 查看容器的ip地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' containerName(containerId)
4.1 修改容器的启动方法
docker container update --restart=always $ContainerName
4.2 启动容器时指定时区
docker run -p 80:80 --name nginx \ -e TZ="Asia/Shanghai" \ -d nginx:1.17.0
4.3 在宿主机查看docker容器 cpu,内存,网络,io使用情况
•查看指定容器情况
docker stats containerName(containerId)
•

•查看所有容器情况 docker stats -a
•查看docker 磁盘使用情况
docker system df

4.4 进入docker容器内部的bash
docker exec -it $ContainerName /bin/bash
•使用root账户进入docker容器内部的bash
docker exec -it --user root $ContainerName /bin/bash
4.5 创建外部网络
docker network create -d bridge my-bridge-network
4.6 修改docker镜像存放的位置
•查看docker镜像存放的位置
docker info | grep "Docker Root Dir"
•关闭docker服务
systemctl stop docker
•移动目录到目标路径
mv /var/lib/docker /mydata/docker
•建立软链接
ln -s /mydata/docker /var/lib/docker
4 使用Dockerfile为SpringBoot应用构建Docker镜像
4.1 Dockfile常用指令
ADD: 用于复制文件,格式: ADD <Src> <DEST>
#将当前目录下的springboot.jar包复制到docker容器的/目录下 ADD springboot.jar /springboot.jar
ENTRYPOINT : 指定docker容器启动时执行的命令,格式:ENTRYPOINT ["executable", "param1","param2"]
#指定docker容器启动时运行jar包 ENTRYPOINT ["java", "-jar","/mall-tiny-docker-file.jar"]
ENV: 用于设置环境变量,格式:ENV
# mysql运行时设置root密码 ENV MYSQL_ROOT_PASSWORD root
EXPOSE: 声明需要暴露的端口(只声明不会打开端口),格式:EXPOSE ...
#声明服务运行在8080端口 EXPOSE 8080
FROM: 指定所需依赖的基础镜像,格式:FROM :<tag>
# 该镜像需要依赖的java8的镜像FROM java:8
MAINTAINER: 指定维护者的名字,格式:MAINTAINER
MAINTAINER ZHAOZUOWEN
RUN: RUN RUN ["executable", "param1","param2"...]
#在容器构建过程中需要在/目录下创建一个mall-tiny-docker-file.jar文件RUN bash -c 'touch /mall-tiny-docker-file.jar'
4.2 编写DOCKfile文件
•在springboot项目里新建一个Dockerfile文件
# 该镜像需要依赖的基础镜像FROM java:8# 将当前目录下的jar包复制到docker容器的/目录下ADD douyin-1.0-SNAPSHOT.jar /douyin-1.0-SNAPSHOT.jar# 运行过程中创建一个douyin-1.0-SNAPSHOT.jar文件RUN bash -c 'touch /douyin-1.0-SNAPSHOT.jar'# 声明服务运行在8080端口EXPOSE 8080# 指定docker容器启动时运行jar包ENTRYPOINT ["java", "-jar","/douyin-1.0-SNAPSHOT.jar"]# 指定维护者的名字MAINTAINER zhaozuowen
•使用maven打包应用

4.3 将应用jar包及Dockerfile文件上传到linux服务器:
4.4 在linux上构建docker镜像
# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的 Dockerfile docker build -t mall-tiny/mall-tiny-docker-file:0.0.1-SNAPSHOT .
4.5 运行应用
docker run -p 8080:8080 --name douyin \-v /etc/localtime:/etc/localtime \-v /mydata/app/dockfile/logs:/var/logs \-d wenzi/douyin:1.0-SNAPSHOT
5 使用maven插件为springboot应用构建docker镜像
5.1 DOCKER REGISTER构建
DOCKER REGISTER 2.0搭建
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
如果遇到镜像下载不下来的情况,需要修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值,然后重启docker服务:
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
5.2 DOCKER开启远程api
5.2.1 用vim编辑器修改docker.service文件
vi /usr/lib/systemd/system/docker.service
需要修改的部分:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
5.2.2 让docker支持http上传镜像
echo '{ "insecure-registries":["192.168.3.101:5000"] }' > /etc/docker/daemon.json
5.2.3 修改配置后需要使用如下命令使配置生效
systemctl daemon-reload
5.2.4 重新启动Docker服务
systemctl stop docker systemctl start docker
5.2.5 开启防火墙的Docker构建端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent firewall-cmd --reload
5.3 使用maven构建docker镜像
5.3.1 在应用的pom.xml文件中添加docker-maven-plugin的依赖
com.spotify docker-maven-plugin 1.1.0 build-image package build wenzi/${project.artifactId}:${project.version} http://192.168.0.100:2375 java:8 ["java", "-jar","/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar
相关配置说明:
•executions.execution.phase:此处配置了在maven打包应用时构建docker镜像;•imageName:用于指定镜像名称,wenzi是仓库名称,${project.artifactId}
为镜像名称,${project.version}
为仓库名称;•dockerHost:打包后上传到的docker服务器地址;•baseImage:该应用所依赖的基础镜像,此处为java;•entryPoint:docker容器启动时执行的命令;•resources.resource.targetPath:将打包后的资源文件复制到该目录;•resources.resource.directory:需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面;•resources.resource.include:需要复制的文件,打包好的应用jar包。
5.3.2 修改application.yml,将localhost改为db
可以把docker中的容器看作独立的虚拟机,应用访问localhost自然会访问不到mysql,docker容器之间可以通过指定好的服务名称db进行访问,至于db这个名称可以在运行应用容器的时候指定。
spring: datasource: url: jdbc:mysql://db:3306/douyin?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root
5.3.3 使用IDEA打包项目并构建镜像
注意:依赖的基础镜像需要先行下载,否则会出现构建镜像超时的情况,比如我本地并没有java8的镜像,就需要先把镜像pull下来,再用maven插件进行构建。
执行maven的package命令:
5.4 运行douyin项目
5.4.1 启动mysql服务
使用docker命令启动:
• docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
•进入运行mysql的docker容器:
docker exec -it mysql /bin/bash
•使用mysql命令打开客户端:
mysql -uroot -proot --default-character-set=utf8
•修改root帐号的权限,使得任何ip都能访问:
grant all privileges on *.* to 'root'@'%'
•创建douyin数据库:
create database douyin character set utf8
•将douyin.sql文件拷贝到douyin容器的/目录下:
docker cp /mydata/douyin.sql mysql:/
•将sql文件导入到数据库:
use douyin;
source /douyin.sql;
5.4.2 启动应用
•使用docker命令启动(--link表示应用可以用db这个域名访问mysql服务):
docker run -p 8080:8080 --name douyin \ --link mysql:db \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/docker/logs:/var/logs \ -d wenzi/douyin:1.0.0-SNAPSHOT
•开启8080端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
6 使用Docker Compose部署SpringBoot应用
Docker Compose是一个用于定义和运行多个docker容器应用的工具。使用Compose你可以用YAML文件来配置你的应用服务,然后使用一个命令,你就可以部署你配置的所有服务了。
6.1 安装docker compose
6.1.1 下载docker compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
6.1.2 修改该文件的权限为可执行
chmod +x /usr/local/bin/docker-compose
6.1.3查看是否已经安装成功
docker-compose --version
6.1.4 使用Docker Compose的步骤
•使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用;•使用docker-compose.yml定义需要部署的应用程序服务,以便执行脚本一次性部署;•使用docker-compose up命令将所有应用服务一次性部署起来。
6.2 docker-compose.yml常用命令
Image
指定运行的镜像名称
# 运行的是mysql5.7的镜像 image: mysql:5.7
container_name
配置容器名称
# 容器名称为mysql container_name: mysql
Ports
配置宿主机和容器端口映射
# 将宿主机的3306端口映射到容器的3306端口 ports: - 3306:3306
volumes
将宿主机的文件或目录挂载到容器中(HOST:CONTAINER)
# 将外部文件挂载到myql容器中 volumes: - /mydata/mysql/log:/var/log/mysql - /mydata/mysql/data:/var/lib/mysql - /mydata/mysql/conf:/etc/mysql
environment
配置环境变量
# 设置mysqlroot帐号密码的环境变量 environment: - MYSQL_ROOT_PASSWORD=root
links
连接其他容器的服务(SERVICE:ALIAS)
#可以以database为域名访问服务名称为db的容器 links: - db:database
6.3 Docker Compose常用命令
6.3.1 构建、创建、启动相关容器
# -d表示在后台运行docker-compose up -d
6.3.2 指定文件启动
docker-compose -f docker-compose.yml up -dCopy to clipboardErrorCopied
6.3.3 停止所有相关容器
docker-compose stopCopy to clipboardErrorCopied
6.3.4 列出所有容器信息
docker-compose ps
6.4 使用Docker Compose 部署应用
6.4.1 编写docker-compose.yml文件
Docker Compose将所管理的容器分为三层,工程、服务及容器。docker-compose.yml中定义所有服务组成了一个工程,services节点下即为服务,服务之下为容器。容器与容器之间可以以服务名称为域名进行访问,比如在mall-tiny-docker-compose服务中可以通过jdbc这个地址来访问db这个mysql服务。
version: '3'services: # 指定服务名称 db: # 指定服务使用的镜像 image: mysql:5.7 # 指定容器名称 container_name: mysql # 指定服务运行的端口 ports: - 3306:3306 # 指定容器中需要挂载的文件 volumes: - /mydata/mysql/log:/var/log/mysql - /mydata/mysql/data:/var/lib/mysql - /mydata/mysql/conf:/etc/mysql # 指定容器的环境变量 environment: - MYSQL_ROOT_PASSWORD=root # 指定服务名称 douyin-docker-compose: # 指定服务使用的镜像 image: wenzi/douyin:1.0-SNAPSHOT # 指定容器名称 container_name: douyin # 指定服务运行的端口 ports: - 8080:8080 # 指定容器中需要挂载的文件 volumes: - /etc/localtime:/etc/localtime - /mydata/app/docker-compose/logs:/var/logs
6.4.2 使用maven插件构建douyin镜像

6.4.3 运行Docker Compose命令启动所有服务
先将docker-compose.yml上传至Linux服务器,再在当前目录下运行如下命令:
docker-compose up -d