# Docker
- 要有Container首先要有Image,也就是说Container是通过image创建的。
- Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。
- 在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象
- Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP
## Docker Hub 网址
`https://hub.docker.com/`
## 查找镜像
`docker search httpd`
## 下载镜像
`docker pull Python3.8`
## images
### 查看本地所有镜像
`docker images`
## 容器/镜像的元数据
`docker inspect python:3.8`
### 删除当前的某个Image的命令
`docker image rm <IMAGE ID>,简写方式为:docker rmi -f <IMAGE ID>`
### 运行一个docker
` docker run -it --name pytest -v ~/PycharmProjects/text_similar:/root/text_similar python:3.8 bash`
- python:3.8 Python为REPOSITORY 3.8为TAG名称
- 运行docker容器可以使用 docekr run <IMAGE STRING>,但用这个命令运行的容器会在运行完后,容器就自动退出了,不能跟用户有交互的效果。
- 想要有交互效果可以使用docker run -it <IMAGE STRING>命令。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
## 容器
### 查看正在运行的容器
`docker ps -a`
### 列出所有已经创建的容器
`docker container ls -a`
### 停止一个容器
`docker stop <CONTAINER ID>`
### 启动一个已经停止的容器
`docker start b750bbbcfd88`
### 删除一个容器
`docker rm -f <CONTAINER ID>`
### 退出容器
`exit`
### 重新进入容器
`docker exec -it 243c32535da7 /bin/bash`
### 导出容器
`docker export 1e560fca3906 > ubuntu.tar`
- 导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
### 导入容器快照
`cat docker/ubuntu.tar | docker import - test/ubuntu:v1`
- 使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
## docker网络设置
### 创建网段
`docker network create --subnet=172.18.0.0/16 mynet`
### 查看网段
`docker network ls`
### 删除网段
`docker network rm mynet`
### 指定网段
`docker run -it --name=p1 --net mynet --ip 172.18.0.2 python:3.8 bash`
- 参数说明:--net 网段名称 --ip IP地址
### 端口映射
`docker run -it -p 9500:9500 -p 9600:3306 python :3.8 bash`
- 参数说明:-p 宿主机端口:容器端口
## docker目录挂载
### docker目录挂载
`docker run -it -v /root/test:/root/project python:3.8 bash`
- 参数说明:-v 宿主机文件夹路径:容器文件夹路径
### 创建MySQL容器
`docker run --name m1 -p 4306:3306 --net mynet --ip 172.18.0.3 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:8.0.18`