镜像名称一般分两部分组成:[repository]:[tag]。
在没有指定tag时,默认是latest,代表最新版本的镜像。
Docker命令图解:
利用docker xx --help命令查看docker save和docker load的语法
命令:docker save -o nginx.tar nginx:latest
之后就可以使用ll
命令查看当前目录下生成名为nginx.tar
的文件
使用docker tag创建新镜像mynginx1.0
使用docker save导出镜像到磁盘
常见的命令:
docker images:显示本地主机上的所有Docker镜像列表。
docker rmi:删除一个或多个本地主机上的Docker镜像。
docker pull:从Docker仓库中拉取一个Docker镜像到本地主机。
docker push:将本地主机上的Docker镜像推送到Docker仓库。
docker save:将一个或多个Docker镜像保存为一个tar归档文件。
docker load:从一个tar归档文件中加载一个或多个Docker镜像。
真正开发的时候可以借助 --help命令来具体查看和学习各种命令的用法
当在Linux中使用Docker时,以下是一些常用的Docker容器基本操作命令:
常见命令图解:
去docker hub查看Nginx的容器运行命令
docker run --name some-nginx -d -p 8080:80 some-content-nginx
命令解读:
真实创建并运行:
docker run --name mn -p 8080:80 -d nginx
以nginx为例:
进入容器。进入我们刚刚创建的nginx容器的命令为:
docker exec -it mn bash
命令解读:
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn :要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
进入nginx的HTML所在目录 /usr/share/nginx/html
cd /usr/share/nginx/html
修改index.html的内容(不能直接使用vi命令,因为镜像封装是只是封装了镜像必备的函数,而vi刚好没有封装)
sed -i 's#Welcome to nginx#你好,Docker容器中的Nginx !#g' index.html
sed -i 's###g' index.html
实质上只是对文件的内容进行替换。运行结果:
可以使用exit命令来退出容器。
问:数据卷解决了什么问题?
答:容器与数据耦合的问题。
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全.
数据卷操作的基本语法如下:
语法:docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:(查看帮助文档)
语法表格:
命令 | 解释 |
---|---|
create | 创建一个volume |
inspect | 显示一个或多个volume的信息 |
ls | 列出所有的volume |
prune | 删除未使用的volume |
rm | 删除一个或多个指定的volume |
docker volume create html
docker volume ls
docker volume inspect html
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录。
docker run --name mn -v html:/usr/share/nginx/html -p 8080:80 -d nginx
解释:
docker run :就是创建并运行容器
– name mn :给容器起个名字叫mn
-v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
-p 8080:80 :把宿主机的8080端口映射到容器内的80端口
nginx :镜像名称
-d :表示后台运行
这样,我们就可以在挂载点的目录下找到我们访问Nginx首页的Index.html文件了,就可以使用vi编辑器或其他外部编辑器进行修改。
挂载并且启动容器再到访问全流程:(Nginx为例)
首先,需要创建html的数据卷(在3.2中已经实现);
使用-v命令添加在创建并且启动Docker容器的命令中(3.3中实现);
使用docker inspect html 查看数据卷的信息:
进入到挂载点进行修改里面的index.html内容;
在浏览器访问:
提示:目录挂载与数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
在DockerHub中查找命令如下:
docker pull mysql
创建目录/tmp/mysql/data
创建目录/tmp/mysql/conf,将配置文件hmy.cnf文件上传到/tmp/mysql/conf
#配置文件内容(就是常见的配置,不用太在意,主要是测试)
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
去DockerHub查阅资料,创建并运行MySQL容器,要求:
挂载/tmp/mysql/data到mysql容器内数据存储目录
挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
设置MySQL密码
“以下命令从DockerHub官网上查询得到”
docker run \
--name mysql # 容器的名称
-e MYSQL_ROOT_PASSWORD=toor \ #设置数据库密码
-p 3306:3306 \ #数据库端口映射
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ # 配置文件的挂载
-v /tmp/mysql/data:/var/lib/mysql \ #数据(目录)文件挂载,记录所以Mysql的数据
-d \ # 后台启动
mysql:latest \
连接测试:
镜像是分层结构,每一层称为一个Layer
基础镜像(BaseImage层):包含基本的系统函数库、环境变量、文件系统
Entrypoint:入口,是镜像中应用启动的命令
其它( Layer 层):在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
什么是Dockerfile?
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./mysql-5.7.rpm /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
测试资料:百度网盘自取
步骤1:新建一个空文件夹docker-demo
步骤2:拷贝课前资料中的docker-demo.jar文件到docker-demo这个目录
步骤3:拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录
步骤4:拷贝课前资料提供的Dockerfile到docker-demo这个目录
Dockerfile内容:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
步骤5:进入docker-demo
步骤6:运行命令:
docker build -t javaweb:1.0 .
# build :构建
# -t :tag ,后面接:[镜像名]:[版本(tag)]
# . :DockerFile 所在的目录
步骤七:启动镜像
docker run --name web -p 8090:8090 -d javaweb:1.0
步骤八:最后访问 http://192.168.12.131:8090/hello/count,其中的ip改成你的虚拟机ip
说明项目成功构建,并且成功将镜像部署在Docker容器下。
项目缺点:例如本例中,如果需要创建多个java项目的镜像,但是配置的Dockerfile文件中的操作,安装JDK等环境变量的配置是不必要的,就会导致代码和操作的冗余,当然解决方法如下一个案例所示。
实现思路如下:
新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
拷贝课前资料提供的docker-demo.jar到这个目录中
编写Dockerfile文件:
基于java:8-alpine作为基础镜像
将app.jar拷贝到镜像中
暴露端口
编写入口ENTRYPOINT
# 指定基础镜像
FROM java:8-alpine
# 如果报错,将上面的java:8改成openjdk:8
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
使用docker build命令构建镜像
docker build -t javaweb:2.0 .
使用docker run创建容器并运行
docker run --name web -p 8090:8090 -d javaweb:2.0