Docker快速入门

docker快速入门

一、docker简介

   Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
   Docker 是用 Go 编程语言编写的并利用 Linux 内核的多个特性来提供其功能。Docker 使用一种称为namespaces容器的技术来提供隔离的工作空间。当您运行容器时,Docker 会为该容器创建一组命名空间。
  特点:更高效的利用系统资源、更快速启动时间、一致的运行环境、持续交付和部署、更轻松的迁移、更轻松的维护和扩展。
  • 虚拟化技术
  在计算机中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象,转换后呈现出来,打破实体结构间的不可分割的障碍,使用户可以比原来的组态更好的方式来应用这些资源。这些资源新虚拟部分不受现有资源的架设方式、地域或物理所限制。一般所指的虚拟化资源包括计算能力和资料存储。主要解决高性能物理硬件产能过剩的重组重用,透明化底层物理硬件。如:软件虚拟化、硬件虚拟化、内存虚拟化等等。
  • 镜像
镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:添加一个文件、执行一个命令、打开一个窗口。
  • 容器
容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。按照我们的java思想去理解,镜像是一个类,容器是类实例化后的对象,一个镜像可以实例化多个容器,容器可以运行多个线程!
  • Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。

二、Docker安装

Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。
 由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。使用yum安装Docker安装

yum安装

  • 更新yum安装包
yum update
  • 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
  • 设置yum源为阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
  • 安装docker (ce:社区免费版 ee:企业版)
yum -y install docker-ce
  • 安装后查看docker版本
docker -v

设置ustc镜像源(默认是dockerhub镜像源)

常见的镜像源:
Docker中国区官方镜像
https://registry.docker-cn.com

网易
http://hub-mirror.c.163.com

ustc  中国科技大学  
https://docker.mirrors.ustc.edu.cn
mkdir -p /etc/docker  #创建docker配置文件夹
vim daemon.json   #创建配置文件
  • daemon.json文件信息
{
 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
 }
  • 配置daemon.json多个镜像源
{
 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"," https://registry.docker-cn.com/"]
}
  • 配置文件生效并重启
systemctl  daemon-reload  #让配置文件配置生效
Systemctl restart docker #重启docker服务

docker常见命令

systemctl stop docker  #停止docker服务
systemctl start docker   #开启docker服务
systemctl restart docker   #重启docker服务
docker info   #查看docker概要信息
systemctl enable docker   #设置docker开机自启
docker --help  #查看docker命令文档
systemctl status docker  #查看docker服务状态

三、镜像与容器常用命令

镜像常用命令

  • 查看镜像
docker images

注意:这些镜像都是存储在Docker宿主机的 /var/lib/docker 目录下

image-20231018204008535

  • 搜索镜像
docker search [镜像名字]

image-20231018204353139

  • 拉取镜像(从中央仓库中下载镜像)
docker pull [镜像名字]  #拉取最新版本镜像
docker pull [镜像名字:版本]  #拉取指定版本镜像
  • 删除镜像
docker rmi [镜像名]  #删除镜像
  • 删除所有镜像
docker  rmi   `docker images -q`  #删除所有镜像

容器常用命令

docker ps #查看正在运行的容器
docker ps -a #查看所有容器
docker ps -l  #查看最后一次运行的容器
docker ps -f status=exited  #查看停止运行的容器

创建和启动容器

docker run 

image-20231018205110361

docker run -it --name=[自定义容器名]  [镜像名:标签]  /bin/bash  #创建容器并运行进入命令行模式
exit #退出容器命令行模式
docker run -di --name=[自定义容器名]  [镜像名:标签]   #后台创建并运行容器
docker exec -it  [自定义容器名]  /bin/bash  #命令行模式登录进后台容器
docker start  [容器名/容器ID]   #启动容器
docker stop   [容器名/容器ID]   #停止容器
docker cp  [宿主机文件位置]  [容器名:容器文件位置及文件名]  #把宿主机的文件拷贝到容器中
docker cp  [容器名:容器文件位置及文件名]  [宿主机文件位置]    #把容器中的文件从宿主机中拷贝出来
#创建并挂载宿主机文件夹
docker run -di -v [宿主机文件目录路径]  [容器名:容器文件目录路径] --name=[容器名]  [镜像名:标签]
docker inspect [容器名]  #查看容器的基本信息
docker inspect --format=‘{{.NetworkSettings.IPAddress}}’  [容器名/容器ID]  #查看容器IP
docker rm [容器名/Id]  #删除容器

四、部署mysql容器

docker pull mysql:8.0.16
#后台运行mysql并设置暴露端口3306 初始化root用户密码为root 暴露映射宿主机端口:3306
docker run -di -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name=mysql  mysql:8.0.16
#进入mysql容器登录mysql
docker exec -it  mysql  mysql -uroot -proot
#更新root用户host为所有IP可访问
update mysql.user set Host='%' where User='root';
#修改数据库密码
alter user 'root'@'%' identified with mysql_native_password by 'root';
#创建用户并设置密码
CREATE USER 'test'@'localhost' identified with mysql_native_password by 'root';
#刷新权限
flush privileges;
#把所有权限授予操作所有表权限授予 test1用户
GRANT all privileges ON *.* TO 'test1'@'%';

五、Nginx部署

docker pull nginx #拉取最新版nginx镜像
docker run -di --name=nginx -p 80:80 nginx  #后台运行nginx并暴露端口
docker cp nginx:/etc/nginx  /usr/local/nginx #把容器内的配置文件拷贝到指定目录
mv nginx conf #修改文件名称
docker stop nginx #停止运行nginx容器
docker rm  nginx  #删除nginx容器
docker run -di --name=nginx -p 80:80 -v [宿主机目录文件]:[容器中目标文件名] [容器名]#后台运行容器并挂载目录

六、RabbitMQ部署

docker pull rabbitmq #拉取rabbitmq镜像
docker run -di --name=rabbitmq -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 rabbitmq #后台创建rabbitmq容器暴露端口
docker exec -it rabbitmq /bin/bash  #登录容器分配伪终端
#在rabbitmq伪终端下操作
rabbitmq-plugins  enable rabbitmq_management #启动可视化插件

七、elasticsearch

docker pull elasticsearch:8.10.6
 #创建容器暴露端口
docker run -di  --name=elasticsearch  -p 9200:9200 -p 9300:9300  elasticsearch:8.10.6
sysctl -w vm.max_map_count=262144  #修改虚拟内存大小 防止elasticsearch启动失败
#创建后台运行容器并暴露端口 
docker run -di --name=elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "cluster.name=elasticsearch" /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins  elasticsearch:8.10.6
#登录elasticsearch容器伪终端
docker exec -it elasticsearch 
#elasticsearch安装ik分词器  (在伪终端操作)
elasticsearch-plugin  install  https://github.com/medcl/elasticsearch-analysisik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip
docker restart elasticsearch  #重启elasticsearch

访问http://192.168.147.110:9200

image-20231019120151500

八、备份与迁移

容器保存为镜像

docker commit [容器名] [自定义镜像名]  #容器回退镜像
docker save -o [*.tar] [自定义镜像名]  #把镜像生成tar文件
docker load -i *.tar  #恢复镜像

执行后再次查看镜像,可以看到镜像已经恢复

九、Dockerfile环境

image-20231019122204243

使用脚本构建jdk8镜像

  • 创建目录
mkdir -p /usr/local/dockerJDK
  • 在目录下上传jdk以及编写Dockefile配置文件(比如:上传jdk-linux包/在线下载)

下载地址:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html(jdk下载地址)并把压缩包放在dockerJDK

cd /usr/local/dockerJDK
  • 编写Dockerfile配置文件 (Dockerfile和jdk.linux.tar.gz要在同一目录下)
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER Mr Zeng
# 进入工作目录
WORKDIR /usr
# 运行创建文件夹
RUN mkdir /usr/local/java
# 把压缩包复制到目录中并解压
ADD jdk-8u381-linux-x64.tar.gz  /usr/local/java/
# 配置环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_381
ENV PATH $JAVA_HOME/bin:$PATH
  • 执行命令
docker build -t jdk8 .  #构建镜像 jdk8
docker images #查看所有镜像

十、Docker私有仓库

  • 拉取私有仓库
docker pull registry
docker run -di --name=registry -p 5000:5000 registry  #后台运行容器并暴露端口

访问http://192.168.147:5000/v2/_catalog 看到{"repositories":[]}表示私有仓库搭建成功!注意开放防火墙端口。

  • docker信任此仓库,可以上传到仓库!
vim /etc/docker/daemon.json
  • daemon.json配置内容
{
"insecure-registries":["192.168.147.5000:5000"]
}  
  • 重启docker
systemctl  daemon-reload  #加载配置文件
systemctl  restart docker #重启docker
  • 打包成私有仓库镜像
docker tag [原镜像名]  [自定义私有仓库镜像名]
  • 重启私服容器
docker restart registry  #重启私服容器
docker push  [自定义私有仓库镜像名] #上传到私有仓库

十一、DockerMaven插件

微服务部署两种方法

  • 手动部署:首先基于源码打包生成jar包(或者war包),将jar包(或war包)上传至虚拟机并拷贝至jdk容器。
  • 通过Maven插件自动部署

修改宿主机的docker配置,让其可以远程访问

vim /lib/systemd/system/docker.service

修改内容如下 (记得开放端口)

ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

重启服务

systemctl daemon-reload  #重新加载配置文件
systemctl  restart docker  #重启docker

在项目中的pom.xml文件中配置如下插件

          <!--docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin-->
           <plugin>
               <groupId>com.spotify</groupId>
               <artifactId>docker-maven-plugin</artifactId>
               <version>1.1.0</version>
               <executions>
                   <execution>
                       <id>build-image</id>
                       <phase>package</phase>
                       <goals>
                           <goal>build</goal>
                       </goals>
                   </execution>
               </executions>
               <configuration>
                  <imageName>ego/${project.artifactId}:${project.version}</imageName>
                   <dockerHost>http://192.168.147.110:2375</dockerHost>
                   <baseImage>java:8</baseImage>
                   <entryPoint>["java", "-jar", "-                                                    Dspring.profiles.active=dev","/${project.build.finalName}.jar"]
                  </entryPoint>
                  <resources>
                      <resource>
                          <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                       </resource>
                 </resources>
              </configuration>
          </plugin>

第二种方式

  • 把jar包上传到服务器特定文件夹下,并编写Dockerfile文件,在同一目录下!

  • Dockerfile文件配置如下:

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=7777"]
EXPOSE 7777
ENTRYPOINT ["java","-jar","/app.jar"]

使用命令打包

docker build -t app .

查看镜像

docker images
posted @ 2023-10-20 19:31  戴莫先生Study平台  阅读(29)  评论(0编辑  收藏  举报