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 目录下
- 搜索镜像
docker search [镜像名字]
- 拉取镜像(从中央仓库中下载镜像)
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
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
八、备份与迁移
容器保存为镜像
docker commit [容器名] [自定义镜像名] #容器回退镜像
docker save -o [*.tar] [自定义镜像名] #把镜像生成tar文件
docker load -i *.tar #恢复镜像
执行后再次查看镜像,可以看到镜像已经恢复
九、Dockerfile环境
使用脚本构建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
本文来自博客园,作者:戴莫先生Study平台,转载请注明原文链接:https://www.cnblogs.com/smallzengstudy/p/17777877.html