java - Docker基础教学
一、Docker介绍
1.1 Docker概念
Docker 是一个开源的应用容器引擎,是C/S架构(客户端-服务端),基于 Go 语言开发。Docker 是一个容器化平台,用于将应用程序及其所有依赖项打包到一个标准化的、轻量级的、可移植的容器中。容器可以在任何环境中(开发、测试、生产)一致地运行。(即一次封装,到处运行)。
1.2 Docker优势
一致的运行环境
更快速的启动时间
隔离性(避免公共服务器,从而受到其他用户影响)
弹性伸缩,快速扩展
迁移方便
持续交付和部署(可以通过定制应用镜像来实现持续集成、交付、部署)
1.3 与虚拟机比较
空间小、运行速度快、用户体验高
1.4 Docker组件
二、Docker安装及卸载
2.1 安装(mac版本)
官网:https://www.docker.com/get-started/

2.2 配置加速镜像
"registry-mirrors": ["https://docker.1ms.run"]


2.3 卸载(关闭docker后通过终端命令彻底卸载)
2.4 安装(Linux)
1.确定你是CentOS7及以上版本
cat /etc/redhat-release
2.yum安装gcc相关(已安装则跳过)
yum -y install gcc
yum -y install gcc-c++
3.安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
4.设置镜像仓库(使用阿里的,快)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.更新yum软件包索引
yum makecache fast
6.安装DOCKER CE(社区版)(DOCKER EE企业版收费)
yum -y install docker-ce
7.启动docker
systemctl start docker
8.配置加速镜像
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.comhttps://docker.1ms.runhttps://8y2y8njn.mirror.aliyuncs.com"]
}
9.重启docker
systemctl restart docker
10.测试
- 检查版本:docker version
- 下载并运行HelloWorld:docker run hello-world
三、常用命令
3.1 docker基础命令
目前本地docker均有客户端操作界面,但是主机操作一般使用命令。
|
启动docker: |
systemctl start docker |
|
停止docker: |
systemctl stop docker |
|
重启docker: |
systemctl restart docker |
|
查看docker状态: |
systemctl status docker |
|
开机启动: |
systemctl enable docker |
|
查看docker概要信息: |
docker info |
|
查看docker帮助文档: |
docker --help |
3.2 指令介绍
|
cp |
本地文件系统(OS操作系统|宿主机)和容器之间进行文件或者文件夹拷贝 |
|
exec |
登录一个容器,使用命令行操作正在运行的容器。 |
|
images |
镜像的集合查询。 |
|
ps |
容器列表 |
|
pull |
下载镜像 |
|
restart |
重启一个或多个容器 |
|
rm |
删除一个或多个容器 |
|
rmi |
删除一个或多个镜像 |
|
run |
创建一个容器,并运行起来 |
|
save |
导出镜像到一个文件(tar)中 |
|
search |
搜索镜像(从Docker Hub) |
|
start |
启动一个或多个已经停止的容器 |
|
stop |
停止一个或多个正在运行的容器 |
3.3 镜像命令
docker images【查看已有镜像】
docker search 镜像名称【搜索镜像】
docker pull 镜像名称【下载镜像】
docker rmi 镜像ID/镜像名称【删除镜像】
docker rmi -f 镜像ID/镜像名称【强制删除镜像(包含正在运行的镜像)】
docker rmi -f 镜像名1:TAG 镜像名2:TAG【删除多个镜像】
docker rmi -f $(docker images -qa)【删除所有镜像】
docker commit【生成镜像】
docker save【备份镜像为tar文件】
docker load【将tar文件恢复为镜像】
3.4 容器命令
3.4.1 基础命令
docker ps【查看正在运行的容器】
docker ps –a【查看所有容器】
docker ps –l【查看最后一次运行的容器】
docker ps -f status=exited【查看停止的容器】
docker inspect 容器名称/容器ID【查看容器IP地址】
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)【精确查找容器IP地址】
exit【退出容器】
docker exec -it 容器名 /bin/bash【进入指定容器】
docker rm 容器名称/容器ID【删除已关闭的容器】
docker start 容器名称【打开容器】
docker stop 容器名称【停止容器】
docker rm -f 容器名称/容器ID【强制删除容器】
docker run -**********【创建容器】
|
-i:表示运行容器 -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 --name :为创建的容器命名。 -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。 -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 |
3.4.2 创建交互式容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
例:docker run -it --name=myredis redis:latest /bin/bash
查看容器可用:docker ps、退出容器可用:exit。
注意:这里exit后,容器也会退出关闭,但不会删除。
3.4.3 创建后台守护式容器
docker run -id --name=容器名称 镜像名称:标签
例:docker run -id --name=myredis2 redis:latest
进入容器可用:docker exec -it myredis /bin/bash、退出容器可用:exit、关闭容器可用:docker stop myredis、打开容器可用:docker start myredis
注意:这里exit后,容器不会退出,因为是后台容器。退出关闭容器需要用docker stop。
3.4.4 文件拷贝(在需拷贝的文件目录下执行)
主机 -> 容器:
docker cp 需要拷贝的文件或目录 容器名称:容器目录
例:docker cp demo.png myredis2:/usr/local/
容器 -> 主机:
docker cp 容器名称:容器目录 需要拷贝的文件或目录
例:docker cp myredis2:/usr/local/demo.png ./
3.4.5 目录映射(将主机和容器目录进行映射,任意一方目录下有变动,另一方也会随之变动)
docker run -id --name=容器的名字 -v 主机目录:容器目录 镜像名称:标签
例:docker run -id --name=myredis2 -v /usr/local/myhtml:/usr/local/myhtml redis:latest
四、容器部署(用户无法直接访问容器端口,所以通过映射到宿主机,用户通过访问宿主机的映射端口从而间接访问容器的相关端口)
4.1 mysql部署
1.拉取mysql
docker pull mysql
2.创建容器
# docker run -id --name=容器名字 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=mysql密码 镜像名称
docker run -id --name=mymysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户远程登陆密码
3.测试
4.2 tomcat部署
1.拉取tomcat
docker pull tomcat
2.创建容器
# 创建tomcat容器;并挂载了webapps目录
docker run -id --name=mytomcat -p 9090:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat-p 表示地址映射
-v 表示目录挂载
3.测试
在/usr/local/webapps目录下创建index.html,/usr/local/tomcat/webapps会自动映射,而后通过访问localhost:9090/查看能否访问成功。
4.3 nginx部署
1.拉取nginx
docker pull nginx
2.创建容器
docker run -id --name=mynginx -p 90:80 nginx
-p 表示地址映射
3.测试
访问localhost:90
4.4 redis部署
1.拉取reids
docker pull redis
2.创建容器
docker run -id --name=myredis -p 6999:6379 redis
-p 表示地址映射
3.测试
通过连接工具进行测试
五、迁移与备份
5.1 docker容器操作步骤
5.2 迁移 -> 备份详细步骤(假设已生成容器testcontainer)
1. 生成新镜像
docker commit 容器名 即将生成的镜像名
docker commit testcontainer testcontainer_a
2. 备份镜像 生成tar文件
docker save -o 即将生成的tar文件名 镜像名
docker save -o testcontainer.tar testcontainer_a
-o:表示output 输出的意思
3. 迁移
将 tar文件 从 主机1 迁移至 主机2
4. 恢复tar文件为镜像
docker load -i tar文件名
docker load -i testcontainer.tar
-i 表示input输入的文件
5. 运行容器
docker run -id --name=newtestcontainer -p 9999:90 testcontainer_a
六、创建自定义docker镜像 - Dockerfile
6.1 常用命令
|
命令 |
作用 |
|
FROM image_name:tag |
定义了使用哪个基础镜像启动构建流程 |
|
MAINTAINER user_name |
声明镜像的创建者 |
|
ENV key value |
设置环境变量 (可以写多条) |
|
RUN command |
是Dockerfile的核心部分(可以写多条) |
|
ADD source_dir/file dest_dir/file |
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
|
COPY source_dir/file dest_dir/file |
和ADD相似,但是如果有压缩文件并不能解压 |
|
WORKDIR path_dir |
设置工作目录 |
6.2 实例1(创建jdk8的自定义镜像)
将/usr/local/dockerjdk8目录下的Dockerfile文件创建为镜像,当后续创建为容器使用时,会自动创建 /usr/local/java/目录,并在该目录下映射jdk文件,从而实现jdk环境配置。
(1)创建目录
mkdir –p /usr/local/dockerjdk8
(2)下载jdk-8u144-linux-x64.tar.gz并上传到服务器上
(3)移动刚刚上传的 jdk 到 /usr/local/dockerjdk8 目录下面
mv jdk-8u144-linux-x64.tar.gz /usr/local/dockerjdk8
(4)/usr/local/dockerjdk8目录下创建文件Dockerfile 并编辑
# !!!!!!!Dockerfile 名字固定的,不能改
vi Dockerfile(5)Dockerfile重设置环境变量 ,设置完成之后 先按下esc , 然后在 :wq 保存退出
#从哪拉取镜像(基础镜像)
FROM centos:7
#指定镜像创建者信息
MAINTAINER cb
#切换工作目录(后续通过run/exec进入该容器后显示的目录就是/usr)
WORKDIR /usr#镜像中创建/usr/local/java目录
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中(这里因为jdk文件和dockerfile文件在同一目录下,否则需要指定jdk文件路径)
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH(6)执行命令构建镜像
#docker build -t=‘镜像名’ .,注意这里的空格和.别丢掉,代表在当前目录下执行加载dockerfile
docker build -t='jdk1.8' .
(7)安装缺少的依赖插件
yum install glibc.i686
(8)查看镜像是否建立完成
docker images
6.3 实例2(创建springBoot项目打包的可执行文件的镜像,常用于部署)
此处仅展示dockerfile文件内容:# 基础镜像(从私有仓库拉取 JDK 1.8 基础镜像 FROM xxxxxxxxx/jdk1.8 # 复制dockerfile文件同目录下的文件到容器/root/目录下 ADD demo-consumer/target/demo-consumer-0.0.1.jar /root/ ADD demo-consumer/target/ko.deploy.sh /root/ # 设置utf-8 避免乱码 ENV LANG en_US.UTF-8 # 设置权限(755 = 所有者可读可写可执行,其他人可读可执行) RUN chmod 755 /root/demo-consumer-0.0.1.jar RUN chmod 755 /root/ko.deploy.sh # 设置端口号 EXPOSE 311111 # 容器启动命令,启动ko.deploy.sh文件 ENTRYPOINT /root/ko.deploy.sh
七、搭建私有仓库
7.1 搭建私有仓库(linux系统)
(1)拉取私有仓库镜像
docker pull registry
(2)启动私有仓库容器
docker run -id --name=registry_a -p 5001:5000 registry
(3)打开浏览器 输入地址 http://ip:5001/v2/_catalog 看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
(4)修改daemon.json(开始配置加速镜像的配置文件)【mac直接在docker可视化界面修改即可】
vi /etc/docker/daemon.json
#添加以下内容,保存退出。目的是让docker信任私有仓库地址
"insecure-registries":["ip:5001"]
(5)重启docker 服务
systemctl restart docker
7.2 镜像上传
(1)标记此镜像为私有仓库的镜像
# 标记镜像为私有仓库的镜像
# docker tag 上传的镜像名 宿主机IP:端口/上传后仓库的镜像名
docker tag jdk1.8 localhost:5001/jdk1.8(2)再次启动私服容器
# 再次启动私有仓库容器
docker start registry(3)上传标记的镜像
# 上传标记的镜像
# docker push 宿主机IP:端口/上传后仓库的镜像名
docker push localhost:5001/jdk1.8(4)访问http://ip:5001/v2/_catalog
7.3 镜像拉取
# 执行拉取镜像命令并查看 - linux主机操作
docker pull 宿主机IP:端口/上传后仓库的镜像名
docker pull localhost:5001/jdk1.8# 执行拉取镜像命令并查看 - dockerfile操作
FROM localhost:5001/jdk1.8
更多推荐





所有评论(0)