镜像:通俗来说就是安装包,比如:redis镜像、mysql镜像,就是redis安装包、mysql安装包。
容器:运行起来的镜像称为容器,就像一个虚拟机一样,我开了一个虚拟机把redis镜像放里面运行,这就是一个运行了redis的容器。可以开多个容器每个容器安装不同的镜像,你也可以把每个容器进行关闭、删除重启等操作。你也可以制作自己的镜像发放给别人使用,比如:你在Ubuntu系统里安装了redis+mysql以及一系列的配置,你把它打包成一个镜像发给别人,别人直接就可以使用,不需要再安装Ubuntu系、redis、mysql以及一系列配置,非常方便。
查看运行中的容器:
docker ps
查看所有的容器(包括未运行的):
docker ps -a
查看所有的镜像:
docker images
删除某一镜像:
docker rmi 镜像id
拉取ubuntu为例
docker pull ubuntu
1. -it为交互式启动,exit 退出后容器会被关闭
docker run -it ubuntu /bin/bash
2. -d为后台启动,exit 退出后容器不会关闭
docker run -dit ubuntu /bin/bash
退出容器后再次进入容器:使用docker ps查看当前运行的容器id,然后使用docker exex 来进入后台运行的容器,例如容器id是4f1a290e927e
docker exec -it 4f1a290e927e /bin/bash
启动被关闭的容器:
(docker ps -a显示的列表里要有该容器id,否则会报错,启动不了)
docker start 容器id
关闭启动的容器:
docker stop 容器id
重启容器:
docker restart 容器id
删除容器:
docker rm -f 容器id
docker run 用于产生一个新的容器并运行;
docker start 用于运行之前被停止的容器;
例如 :
docker run -dit ubuntu /bin/bash 命令执行两次会得到两个容器,每个容器里都运行着一个ubuntu 。
在两个容器中分别建立文件A和B,然后关闭这两个容器。接下来再使用docker start 命令来分别启动两个容器,会看到两个容器中的文件A和B依然存在。
导出:
docker export 容器id -o 导出为的文件
例如:
docker export 4f1a290e927e -o ubuntu.tar
导入
docker import 导出为的文件 镜像名称:[tag名称]
例如:
1.导入ubuntu.tar到镜像仓库,镜像的名称为myubuntu
docker import ubuntu.tar myubuntu
2.导入ubuntu.tar到镜像仓库,镜像的名称为myubuntu1,tag为v1
docker import ubuntu.tar myubuntu1:v1
使用docker images查看到镜像仓库如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu1 v1 b956e7df05b4 5 seconds ago 77.8MB
myubuntu latest 3619e5cf1b77 47 seconds ago 77.8MB
容器重命名的好处是不用容器id来进行操作,这样比较方便和直观的操作容器。
例如,给运行ubuntu时给容器起个名字myubuntu1:
(注意,容器的名称s是唯一的,如果已经有一个容器已经叫myubuntu1了,则不能再重命名为myubuntu1)
docker run -dit --name=myubuntu1 ubuntu /bin/bash
使用docker ps 查看:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cd6c5413578 ubuntu "/bin/bash" About a minute ago Up About a minute myubuntu1
现在就可以使用myubuntu1这个名字来关闭、重启或者删除等命令来操作容器,而不必使用容器id来操作。
例如,停止该容器:
docker stop myubuntu1
-P 随机分配主机的端口给容器
docker run -d -P --name=mynginx1 nginx
查看端口:
docker port mynginx1
80/tcp -> 0.0.0.0:49154
80/tcp -> :::49154
即容器内部的80端口被随机映射到了宿主机的49154端口
-p 指定端口主机的端口给容器
(-p 80:80 端口进行映射,将本地 80 端口映射到容器内部的 80 端口)
docker run -d -p 80:80 --name=mynginx2 nginx
查看端口:
docker port mynginx1
80/tcp -> 0.0.0.0:80
80/tcp -> :::80
即容器内部的80端口被映射到了宿主机的80端口
从容器复制到主机
将 mynginx2 这个容器的 /etc/nginx/nginx.conf 文件复制到主机的 /usr/local/ 目录
docker cp mynginx2:/etc/nginx/nginx.conf /usr/local/
从主机复制到容器
将 /usr/local/aaa.txt 这个文件从主机复制到容器的 /etc/nginx 目录(若容器里不存在这个目录,会自动创建)
docker cp /usr/local/aaa.txt mynginx2:/etc/nginx/
说明:
1.复制操作可以是正在运行或已停止的容器;
2.若主机没有指定具体的路径则表示当前目录
文件挂载就相当于容器和主机共享文件,对于数据的持久化保存,或者一些配置文件希望放到容器外可以采用文件挂载。
比如:容器里的应用产生的日志希望同步输出到容器外可以采用文件挂载、通过文件挂载把nginx的配置文件放到主机这样就不用每次进到容器里修改配置文件。
-v 容器外部文件夹路径:容器内部文件夹路径
docker run -d --name=mynginx3 -p 80:80 -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx