【笔记】Docker学习笔记

前言

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。(维基百科

安装Docker

MacOS

1
brew cask install docker

Linux

  • 在CentOS安装Docker

下载依赖

1
yum -y install yum-utils device-mapper-persistent-data lvm2

设置下载Docker的镜像源(可选)

1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker

1
2
yum makecache fast
yum -y install docker-ce

启动Docker

MacOS

  • 直接在启动台打开Docker.app

Linux

启动服务

1
systemctl start docker

设置开机自启

1
systemctl enable docker

测试是否安装成功

1
docker run hello-world

中央仓库

配置私服

Linux

  • 编辑daemon.json配置文件
1
vim /etc/docker/daemon.json
  • 修改配置文件

<ip>:私服ip
<port>:私服端口号

1
2
3
4
{
"registry-mirrors":["https://registry.docker-cn.com"],
"insecure-registries":["<ip>:<port>"]
}
  • 重启两个服务
1
2
systemctl daemon-reload
systemctl restart docker

镜像操作

拉取镜像到本地

<name>:镜像名

1
docker pull <name>

指定版本

1
docker pull <name>:<version>

查看全部的镜像

1
docker images

删除本地镜像

<image_id>:镜像标识(可以简写)

1
docker rmi <image_id>

强制删除

  • 如果容器存在,不能直接删除,可以强制删除镜像
1
docker rmi -f <image_id>

查看镜像中设置的默认命令

1
docker history <image_id>

指定任意命令替换默认

<command>:Linux命令

1
docker run -it <image_id> <command>

镜像的导入导出(不规范)

导出

<src>:导出的路径
<name>:导出后的文件名

1
docker save -o <src>/<name> <image_id>

导入

1
docker load -i <src>/<name>
修改导入后的空名称
  • 修改导入后默认的名称null

:<version>:标签,通常为版本号,默认为最新版本lastest(可选)

1
docker tag <image_id> <name_new>:<version>

镜像的导入导出(重定向)

导出

1
docker save <name> <name>:<version> | gzip > <src>/<name>

导入

1
docker load < <src>/<name>

清理所有名称为空的镜像

1
docker image prune -f

容器的操作

运行容器

<name>:<version>:镜像名和标签指定镜像
<image_id>:通过镜像唯一标识指定镜像

1
2
3
docker run <name>:<version>

docker run <image_id>

参数

-d:后台运行容器
-p:为了映射当前宿主机的端口和容器的端口

<port_out>:宿主机端口
<port_in>:容器端口

--name <name>:指定容器名称

<name>:容器名称

-e:在容器中添加环境变量
-i:交互,通常和-t组合使用
-t:提供终端
--rm:容器关闭时,自动删除容器
--restart=always:容器总是自动启动,当docker重启,容器也会自动启动

1
2
3
docker run -d -p <port_out>:<port_in> --name <name> <name>:<version>

docker run -d -p <port_out>:<port_in> --name <name> <image_id>
1
docker run -it <image_id>
mysql在运行时指定初始密码
  • 通过添加环境变量设置初始密码
1
docker run -d -p <port_out>:<port_in> --name <name_in> -e MYSQL_ROOT_PASSWORD=<password> <image_id>

查看正在进行的容器

1
docker ps

参数

-a:查看所有容器,包括未运行的容器
-q:只查看标识,不查看别的内容

1
2
3
docker ps -aq

docker container ls -a

启动容器

<con_id>:容器的唯一标识

1
docker start <con_id>

重启容器

1
2
3
docker restart <con_id>

docker container restart <con_id>

停止容器

1
2
3
docker stop <con_id>

docker container stop <con_id>

停止全部容器

1
docker stop $(docker ps -aq)

删除容器

  • 删除容器之前要停止容器
1
docker rm <con_id>

强制删除容器

  • 如果容器正在运行,不能直接删除,可以强制删除
1
docker rm -f <con_id>

删除全部容器

1
docker rm $(docker ps -aq)

进入到容器内部

  • 不推荐在容器内部进行关闭服务的操作
1
2
3
docker exec -it <con_id> bash

docker exec -it <con_id> <command>

查看容器的日志

-f:滚动查看日志的最后几行

1
2
3
docker logs <con_id>

docker container logs <con_id>

清理所有终止状态的容器

1
docker container prune

复制宿主机内容到容器内部

<file_old>:宿主机文件的路径及文件名
<file_new>:容器内部文件想要存放的路径名

1
docker cp <file_old> <con_id>:<file_new>

数据卷

  • 将宿主机的一个目录映射到容器的一个目录中
  • 可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变

创建数据卷

  • 创建数据卷后,宿主机会产生一个新目录,作为数据卷交换数据的目录

/var/lib/docker/volumes/<name>/_data

<name>:数据卷名称

1
docker volume create <name>

查看数据卷的详细信息

1
docker volume inspect <name>

查看全部数据卷

1
docker volume ls

删除数据卷

1
docker volume rm <name>

映射数据卷

  • 类似于挂载操作(将容器内部的指定目录映射到宿主机的指定目录)

-v:指定映射数据卷的参数

<src_out>:定义一个数据卷在宿主机的存放路径及目录名(如果在这之前没有创建过数据卷,Docker会自动创建目录并将其作为数据卷映射的目录,缺点是不能将当前容器内部的数据同步出来。如果在这之前创建过数据卷,请指定路径为创建数据卷后的默认路径,优点是能将容器内部当前的数据同步出来。所以推荐先手动创建数据卷,再将路径指向新建数据卷后的默认位置)
<src_in>:想要映射容器内部目录的路径

1
docker run -d -p <port_out>:<port_in> --name <name_in> -v <src_old>:<src_in> <image_id>

容器互联

创建虚拟网络

--subnet=172.18.0.0/24:指定网段和子网掩码
-d:指定网络类型

bridge
overlay

<name>:网络名称

1
docker network create <name>

查看所有虚拟网络

1
docker network ls

删除虚拟网卡

docker network rm

查看网络详情

1
docker inspect <name>

查看宿主机上新建的虚拟网卡

1
ifconfig

连接虚拟网络

  • 默认网段为172.18.0.0,默认宿主机IP为172.18.0.1

--ip:手动指定固定IP
--net:等价于–network

1
docker run --network <name> <image_id>

自定义镜像

  • 相当于自定义构建脚本Dockfile文件,通过构建脚本自动化构建环境

创建一个Dockerfile文件

  • 创建一个Dockerfile文件(无扩展名),并且指定自定义镜像信息

Dockerfile文件中的特殊命令

FROM:指定当前自定义镜像以来的环境
ADD:将压缩包传入镜像中的指定目录,并同时解压
RUN:在镜像内执行一条命令
ENV:设置环境变量
EXPOSE:暴露端口
ENTRYPOINT:设置启动时执行的命令
COPY:将相对路径下的内容复制到自定义镜像中
WORKDIR:声明镜像默认的工作目录
CMD:需要执行的命令(在workdir下执行,cmd可以写多个但只以最后一个为准)

编辑Dockerfile文件

  • 创建并编辑Dockerfile文件
1
vim Dockerfile
  • 举例:在CentOS7系统上配置JDK8环境,并部署Tomcat7服务器
1
2
3
4
5
6
7
8
9
FROM centos:7
ADD jdk-8u212-linux-x64.tar.gz /opt/
ADD apache-tomcat-7.0.96.tar.gz /usr/
RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat
ENV JAVA_HOME=/opt/jdk1.8.0_212 \
CATALINA_HOME=/usr/tomcat \
PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin
EXPOSE 8080
ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
  • 举例:在Tomcat部署JAVA项目
1
2
3
4
5
6
FROM centos:7
ADD jdk-8u212-linux-x64.tar.gz /opt/
COPY sp05-eureka-0.0.1-SNAPSHOT.jar /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_212 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jdk1.8.0_212/bin
ENTRYPOINT ["java", "-jar", "/opt/sp05-eureka-0.0.1-SNAPSHOT.jar"]
CMD ["--spring.profiles.active=eureka1", "--server.port=2001"]

通过Dockerfile制作镜像

<name>:自定义的镜像名称,后面可以追加:版本号
<dockerfile>:Dockerfile文件存放的的路径,脚本中涉及到的文件需要放在同一个目录下

1
docker build -t <name> <dockerfile> 

docker-compose

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a Compose file to configure your application’s services. Then, using a single command, you create and start all the services from your configuration. To learn more about all the features of Compose see the list of features.(Github

  • 通过docker-compose批量管理Docker容器

准备工作

  • 添加执行权限
1
chmod +x docker-compose

配置文件

创建配置文件

  • 配置文件要和docker-compose在同一目录下
1
touch docker-compose.yml

编辑配置文件

1
vim docker-compose.yml

修改配置文件

  • 同时管理Mysql和Tomcat的配置示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "3.1"
services:
mysql:
restart: always
image: mysql
container_name: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
TZ: UTC
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: UTC

启动docker-compose管理的容器

1
docker-compose up

以后台启动

1
docker-compose up -d

关闭并删除docker-compose管理的容器

1
docker-compose down

开启docker-compose管理的容器

1
docker-compose start

关闭docker-compose管理的容器

1
docker-compose stop

重启docker-compose管理的容器

1
docker-compose restart

查看docker-compose管理的容器

-a:查看所有容器,包括未运行的容器
-q:只查看标识,不查看别的内容

1
docker-compose ps

查看docker-compose管理的容器日志

-f:滚动查看

1
docker-compose logs -f

完成

参考文献

哔哩哔哩——千锋Java学习营
菜鸟笔记
哔哩哔哩——云原生技术架构