Docker的使用
1. docker的组成部分
docker镜像,docker容器 --->docker容器是基于docker镜像的
2. docker的安装步骤:直接在linux的根目录下(cd /),不需要创建文件夹 如果需要查看docker的安装路径:cd /var/lib/docker
1)# 1、查看centos版本 要求64位centos版本在6.5及以上,内核版本2.6.32 ‐431及以上版本
# uname ‐ r
补充:如果不是大于3.10版本,使用:sudo yum update(选作) 将yum包更新到最新版本 在更新的时候可能会遇到关不掉的情况,那么我们可以强制的关掉,使用:rm -f /var/run/yum .pid(强制关掉yum进程)
2)作用: 安装需要的软件包 yum-util 提供yum-config-manager功能
sudo yum install - y yum- utils device- mapper- persistent- data lvm2
3)出现输入的界面都按 y
yum install docker
4)查看docker版本
docker -v
3. 设置镜像加速,因为docker是从远程仓库拉取的
登录阿里云,选择控制台,找到容器与中间键
4)打开配置文件,然后将我们复制的内容粘贴进去
# v i m / e t c / d o c k e r / d a e m o n . j s o n
3. Docker的启动与停止命令
1)启动docker服务
systemctl start docker
2) 停止docker服务
systemctl stop docker
3) 重启docker服务
systemctl restart docker
4)查看docker状态systemctl status docker
5 )设置开机启动docker服务:
systemctl enable docker
4. Docker的常用命令
Docker镜像相关命令:
查看镜像------docker images
搜索镜像------docker search tomcat(镜像名)
拉取镜像------docker pull tomcat(镜像名称)
我们也可以拉取指定版本的镜像:docker pull centos:7
删除镜像------docker rmi tomcat(镜像id)
可以先通过docker images查看所有镜像,找到需要删除的镜像id进行删除
Docker容器的相关命令:
查看容器:
查看正在运行的容器:docker ps
查看所有容器:docker ps -a
创建并启动容器:
可以基于已有的镜像来创建和启动容器 ,创建与启动容器使用命令:docker run
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后 ,容器创建就能登录进去。即分配一个伪终 端。
--name :为创建的容器命名。
-v :表示目录映射关系 (前者是宿主机目录 ,后者是映射到宿主机上的目录) ,可以使用多个-v做 多个目录或文件映射。注意:最好做目录映射 ,在宿主机上做修改 ,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行 (这样创建容器后不会自动登录容器 ,如果只加-i -t 两个参数 ,创建后就会自动进去容器) 。
-p :表示端口映射 ,前者是宿主机端口 ,后者是容器内的映射端口。可以使用多个-p做多个端口映射
1)交互式容器:以交互式方式创建并启动容器 ,启动完成后 ,直接进入当前容器 。使用exit命令退出容器 。需要注意的是以此种方式 启动容器 ,如果退出容器 ,则容器会进入停止状态。
创建并启动名称为 mycentos7 的交互式容器; 下面指令中的镜像名称 centos:7 也可以使用镜像id
docker run -it --name=mycentos7 centos:7
退出容器:exit
2)守护式容器:
创 建 一 个守护式容器; 如果对于一个需要长期运行的容器来说 , 我们可以创建一个守护 式容器 。 命令如下(容器名称 不 能 重 复 )
#创建并启动守护式容器
docker run -di --name=mycentos2 centos:7
# 登 录进入容器命令为: docker exec -it container_name (或者 container_id)/bin/bash (exit推出时,容器不会停止)
docker exec - it mycentos2 /bin/bash
退出:exit
启动容器:docker start centos7(可以使用容器名称或者id)
停止容器:docker stop d88b51fb31ea(可以使用容器名称或者id)
查看容器ip:docker ps
删除容器:docker rm d88b51fb31ea(容器id:删除容器的时候需要将容器先停止掉)
查看容器的ip地址:docker inspect centos7
5. Docker应用部署
1)mysql部署:
拉取mysql5.7镜像:
docker pull centos/mysql-57-centos7
创建容器:
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 centos/mysql-57 -centos7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口 -e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用 root登录的话, 那么其密码为空)
操作mysql容器:
# 进入到mysql容器中
docker exec -it mysql5.7 /bin/bash
# 登录容器里面的mysql:这个时候会让你输入密码,是不需要输入的,因为我们是在容器里面输入的,如果时远程登录,比如使用我们的navicate登录的话,就需要输入密码了
mysql -u root -p
#退出mysql容器
需要输入两次:exit (第一次是推出mysql,第二次是退出mysql容器)
远程连接我们的mysql容器:如果出现连接不上的情况,检查一下防火墙,或者我们的端口号是否放过
2)nginx的部署
# 拉取nginx镜像
docker pull nginx
# 创建nginx容器
docker run -di --name=mynginx -p 80:80 nginx
启动后在宿主机上访问: http://宿主机IP/
3)Dockerfile文件
上面我们已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们 想自己开发一个镜像,那该如 何做呢?答案是:Dockerfile
Dockerfile常用命令:
使用Dockerfile创建镜像
1)在一个空白目录中 ,建立一个文本文件 ,并命名为 Dockerfile: (首字母必须要大写,且名字必须是Dockerfile) Dockerfile 文件用来说明如何来构建镜像
# mkdir mynginx
# cd mynginx
# touch Dockerfile
其内容为:
FROM nginx
RUN echo '<h1>Hello,Docker!</h1>' > /usr/share/nginx/html/index.html
这个 Dockerfile 很简单 ,一共就两行。涉及到了两条指令 ,FROM 和 RUN。 :
FROM 指基础镜像
所谓定制镜像,那一定是以一个镜像为基础 ,在其上进行定制。
就像我们之前运行 了一个nginx 镜像的容器 ,再进行修改一样 ,基础镜像是必须指定的。而 FROM 就是 指定基础镜像 ,因此一个 Dockerfile中 FROM 是必备的指令 ,并且必须是第一条指令。
如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础
接下来所写的指令将作为镜像第一层开始存在。
# FROM scratch
# ...
RUN 指令是用来执行命令行命令的;
Dockerfile 中每一个指令都会建立一层 , RUN 也不例外。每一个 RUN 的行为 , 就是新建 立一层 ,在其上执行这些命令 ,执行结束后 ,commit 这一层的修改 ,构成 新的镜像。
注意:不要写多个 RUN,那样产生非常臃肿、非常多层的镜像 ,不仅仅增加了构建部署的 时间也很用易出错
Dockerfile 正确的写法: (案例:编译、安装 redis 可执行文件) 多个run中间是使用&号进行连接的
FROM debian:jessie RUN buildDeps='gcc libc6 ‐dev make' \ && apt ‐get update \ && apt ‐get install ‐y $buildDeps \ && wget ‐O redis.tar.gz "http://download.redis.io/releases/redis ‐3.2.5.t ar.gz" \ && mkdir ‐p /usr/src/redis \ && tar ‐xzf redis.tar.gz ‐C /usr/src/redis ‐‐strip ‐components=1 \ 9 && make ‐C /usr/src/redis \ && make ‐C /usr/src/redis install \ && rm ‐rf /var/lib/apt/lists/* \ && rm redis.tar.gz \ && rm ‐r /usr/src/redis \ && apt ‐get purge ‐y ‐‐auto
最后添加了清理工作的命令 ,删除了为了编译构建所需要的软件 ,清理了所有下载、展开 的 文件 ,并且还清理了apt 缓存文件。
这是很重要的一步 ,我们之前说过 ,镜像是多层存 储, 每一层的东西并不会在下一层被删除 ,会一直跟随着镜像。 因此镜像构建时 ,一定要 确保每 一层只添加真正需要添加的东西 ,任何无关的东西都应该清理掉。
(类似盖完楼,拆除脚手架)
回到之前定制的 nginx 镜像的 Dockerfile 来。现在我们明白了这个 Dockerfile 的 内容 ,那么让我们来构建这个镜像。 我们使用了 docker build 命令进行镜像构建。其格式为:
2)基于镜像创建容器
在这里我们指定了最终镜像的名称 t nginx :v1 ,构建成功后,就可以运行这个镜像。 查看镜像信息
docker images
启动镜像
docker run -id --name=mynginx2 -p 81:80 mynginx:v1
浏览器进行访问:http://192.168.220.130/:81/ 注意:开放81端口,否则浏览器无法访问
3)部署springboot项目
将我们需要部署到容器中的项目打包:需要先确保本地运行没有问题再去部署
然后进行我们linux系统中,创建docker目录,再在当前目录下创建一个mytest文件夹,进入mytest文件夹下,创建Dockerfile文件(注意:Dockerfile文件一定要和我们的boot项目压缩包处于同一级目录下)
在mytest下,上传我们的boot项目jar包
然后vim Dockerfile,然后将下面内容复制进去:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD springboot_docker-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中,
简单解释一下:FROM ,表示使用 Jdk8 环境为基础镜 像,如果镜像不是本地的会从 DockerHub 进行下载 VOLUME ,
VOLUME 指向了一个/tmp 的目录,由于 Spring Boot 使用内置的 Tomcat 容器,Tomcat 默认使用/tmp 作为工作目录。
这 个命令 的效果是:在宿主机的/var/lib/docker 目录下创建一个临时文 件并把它链 接到容器中的/tmp 目录 ADD ,拷贝文件并且重命名
必须在项目所在目录下执行此命令:
# docker build ‐t mytest:v1 .
注: mytest:自定义的镜像名,全部小写 v1:自定义版本号,不写默认为最新版本
看到如下信息,证明执行成功了:
在运行之前,我们需要修改下述信息:
然后创建容器:
docker run -idt --name=test -p 8081:8080 mytest:v1
查看正在运行的容器:
docker ps
访问:http://宿主机 ip:端口号
如果我们的boot项目是需要连接数据库的话,那么我们需要在项目中修改下连接数据库信息:
4)使用idea连接远程docker
4.1 配置docker远程连接端口
vim /usr/lib/systemd/system/docker.service
找到 ExecStart,在最后面添加-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock ,如下图所示
4.2 开放端口:(防火墙关闭忽略)
firewall‐cmd ‐‐zone=public ‐‐add‐port=2375/tcp ‐‐permanent
刷新防火墙状态
firewall‐cmd ‐‐reload
查看开放的端口号
firewall‐cmd ‐‐list‐ports
4.3 重启docker
systemctl start docker
systemctl daemon‐reload
重新启动 Docker 后台服务: 4 # service docker restart
4.4 IDEA安装插件 重启
在idea中安装docker插件,然后重启idea
4.5 idea远程连接docker
我们依次打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:tcp://192.168.145.128:2375
配置一下 Docker 的地址,配置完成后,可以看到下面有一个 Connection successful 提 示,这个表示 Docker 已经连接上了。 如此之后,我们的准备工作就算是 OK 了。
4.6 在项目中添加插件
<plugins> <!--镜像启动插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--配置部署到远程docker中--> <!--一键部署--> <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> <!--基础镜像--> <baseImage>java:8</baseImage> 2、在src/main目录下创建docker目录,并创建Dockerfile文件 1 FROM openjdk:8‐jdk‐alpine 2 ADD *.jar app.jar 3 ENTRYPOINT ["java","‐Djava.security.egd=file:/dev/./urandom","‐jar","/ap p.jar"] <!--作者信息--> <maintainer>wangbohao</maintainer> <!--切换到/ROOT目录--> <workdir>/ROOT</workdir> <cmd>["java","-version"]</cmd> <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint> <!--指定远程 docker api地址--> <dockerHost>http://192.168.220.130:2375</dockerHost> <resources> <resource> <targetPath>/ROOT</targetPath> <!--用于指定需要复制的跟目录 此处配置的${project.build.directory}是 即对应 target 目录--> <directory>${project.build.directory}</directory> <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins>
在src/main目录下创建docker目录,并创建Dockerfile文件
然后再Dockerfile文件中添加如下信息
FROM openjdk:8-jdk-alpine
ADD *.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
然后点击:
然后maven打包:
最后运行:
然后浏览器访问: