1、镜像相关命令
- 镜像名称一般分两部分组成:[repository]:[tag]。
- 在没有指定tag时,默认是latest,代表最新版本的镜像。
比如mysql:5.7 mysql指的是repository,5.7是tag。
docker builder构建一个镜像
dicker images 查看本地镜像
docker rmi xxx 删除镜像
docker push 推送镜像到远程仓库
docker pull 拉取镜像
docker save保存镜像为压缩包
docker load 加载压缩包为镜像
2、使用
1、首先去镜像仓库搜索nginx镜像,比如https://registry.hub.docker.com/
可以进去查看我们可以获取的一些信息
2、根据查看到的镜像信息,拉取指定版本,或者最新的
sudo docker pull nginx
3、查看本地镜像
sudo docker images
其他命令:
sudo docker save -o nginx.tar nginx:latest #保存为tar
sudo docker rmi nginx:latest #删除
sudo docker load -i nginx.tar #加载tar为镜像
docker load --help #查看load命令
3、容器命令
3.1、创建运行一个Nginx容器
docker run --name containerName -p 80:80 -d nginx
命令解读:
- docker run :创建并运行一个容器
- –name : 给容器起一个名字
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
3.2、查看日志
docker logs -f xxx
查看名字为xxx的容器日志
3.3、进入刚才的容器
docker exec -it mn bash
命令解读:
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn :要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
exit是退出
3.4、进入nginx html目录
cd /usr/share/nginx/html
修改index.html
sed -i 's#Welcome to nginx#hello#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
不推荐在容器中修改文件,很不方便。
3.5、总结
每个命令都可以使用在后面加–help来查看用法。
比如docker ps --help可以知道,docker ps -a 命令可以查看所有的容器,docker ps只能看大运行的容器。
nginx容器启动后,localhost访问成功。
4、容器与数据耦合问题
4.1、存在的问题
4.2、数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
我们可以将容器中的文件绑定到数据卷,这样,不同的容器就能共享相同的文件了。
4.3、操做数据卷
docker volume [COMMAND]
#docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
1、创建数据卷
2、列出所有数据卷
3、显示数据卷信息
Mountpoint:指的是真实的目录
4、删除未使用的数据卷
5、挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录
docker run \ #docker run :就是创建并运行容器
--name mn \ #--name mn :给容器起个名字叫mn
-v html:/root/html \ #-v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
-p 8080:80 #-p 8080:80 :把宿主机的8080端口映射到容器内的80端口
nginx \ #nginx :镜像名称
我们先把之前创建的容器都删除了,然后创建新的:
可以看到,容器中的文件跑到了真实的目录下:
这样就可以用vi修改了。而且其他容器也能共享这些文件。
6、宿主机目录挂载
6.1、差异
之前是将容器目录挂载到数据卷下,这种方式是交给docker管理,目录比较深。
我们还可以直接挂载到我们指定的目录下。
6.2、操作
目录挂载与数据卷挂载的语法是类似的:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
比如:
docker run --name mn -p 80:80 -v /home/dev/nginx/:/usr/share/nginx/html/ -d nginx
自己测试,这样不会自动创建出文件。
7、自定义镜像
7.1、镜像结构
镜像是分层结构,每一层称为一个Layer
- BaseImage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
7.2、什么是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