docker
查看Docker的默认存储路径
用以存放拉取的镜像和创建的容器等
docker info
镜像命令
下载镜像:指定版本
docker pull mysql:5.7
展示镜像列表
docker image ls
dokcer images
删除镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
docker rmi -f IMAGE ID //-f:force强制删除
docker rmi -f $(docker images -aq) //docker images -aq 展示所有镜像id
容器命令
新建容器并启动
docker run [可选参数] images
-it 使用交互方式运行,进入容器查看内容
-d 后台启动
-p hostport:containerport 指定宿主机port、指定容器port,将宿主机端口映射到容器端口,一个指定宿主机端口上只可以绑定一个容器
//启动并进入容器
[root@iZuf61ii8wkx9swllq8eofZ ~]# docker run -it centos /bin/bash
[root@f6ba11f6933e /]#
列出容器列表
docker container ls
docker ps //列出打开的容器
docker ps -a //列出打开和关闭的容器
退出容器
exit //容器停止并退出
Ctrl+P+Q //容器不停止退出
进入容器
docker exec -it tomcat01 bash
删除容器
docker rm -f 容器名 //删除指定容器
docker container prune//删除所有终止的容器
启动和停止容器
docker start id //开启容器
docker stop id //关闭
docker restart id //重启
docker kill id //杀死
数据管理
在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。
数据卷
- 创建数据卷
docker volume create my-vol // 在宿主机创建一个自定义容器卷
docker volume ls // 查看所有容器卷
docker volume inspect my-vol // 查看指定容器卷详情信息
- 启动一个挂载数据卷的容器
在用 docker run
命令的时候,使用 --mount
标记来将 数据卷
挂载到容器里。在一次 docker run
中可以挂载多个 数据卷
。
下面创建一个名为 web
的容器,并加载一个 数据卷
到容器的 /usr/share/nginx/html
目录。
$ docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine
如果没有通过-v指定数据卷,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载
设置读写权限
-v只读:docker run -it -v 宿主机目录:容器内目录:ro 镜像名//容器对数据卷可读不可写,宿主机可读可写
--mount只读:--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly
- 查看数据卷的具体信息
在主机里使用以下命令可以查看 web
容器的信息
docker inspect web
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
- 删除指定的数据卷
docker volume rm my-vol
- 删除无主的数据卷
docker volume prune
挂载主机目录
- 挂载一个主机目录作为数据卷
使用 --mount
标记可以指定挂载一个本地主机的目录到容器中去
$ docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
nginx:alpine
上面的命令加载主机的 /src/webapp
目录到容器的 /usr/share/nginx/html
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。
本地目录的路径必须是绝对路径,以前使用
-v
参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用--mount
参数时如果本地目录不存在,Docker 会报错。
- 查看数据卷具体信息
在主机里使用以下命令可以查看 web
容器的信息
$ docker inspect web
挂载主机目录
的配置信息在 "Mounts" Key 下面
"Mounts": [
{
"Type": "bind",
"Source": "/src/webapp",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
数据的覆盖问题
- 如果挂载一个空的数据卷到容器中的一个非空目录中,那么容器目录下的文件会被复制到数据卷中。(适用于数据卷)
- 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。(适用于挂载主机目录)
这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。
volumes与bind mounts的区别
- volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中
- bind mounts:意为着可以存储在宿主机系统的任意位置
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
Tomcat
- 拉取镜像
docker pull tomcat
- 创建容器,重命名为tomcat01,并将容器端口8080映射到服务器的3355端口
docker run -d -p 3355:8080 --name tomcat01 tomcat
- 进入容器(通过别名)
docker exec -it tomcat01 bash
docker@ggbond:~$ docker exec -it tomcat01 bash
root@156f0cbfb9ae:/usr/local/tomcat#
- webapps下面是空的,可以将webapps.dist下的文件复制到webapps中
cp -r webapps.dist/* webapps
mysql
docker pull mysql:5.7
docker run -d -p 3310:3306 -v /home/mysql/config:/etc/mysql/config.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
--name:容器名字
-e:配置mysql密码
-d:后台运行
-p:端口映射
-v:卷挂载
docker exec -it mysql01 bash