可以把镜像运行成容器,一个镜像可以运行出多个容器
案例(把centos7 运行成容器)
# --name=centos7 容器名
# run :创建并运行
# -di :创建出容器并运行,命令行还在宿主机
docker run -di --name=centos7 centos:centos7
容器操作命令
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 查看最后一次运行的容器
docker ps -l
# 启动停止的容器
docker start id/名字
# 停止运行的容器
docker stop 7d5e
# 停止所有在运行的容器
docker stop `docker ps -q`
# 删除容器
docker rm 容器id
# 一次性删除所有容器
docker rm `docker ps -a -q`
# 一次性删除所有镜像
docker rmi `docker images -q`
# 进入到容器内部
docker exec -it 容器id /bin/bash
docker exec -it 90fd0665494f /bin/bash
记住四条:
docker ps
docker ps -a
docker start
docker stop
run 运行容器操作
# run :运行容器
-如果容器不存在,会先创建再运行
-create 容器,run运行
- 创建并运行容器
# 运行一个centos7容器
docker run -id --name=容器名字 镜像:标签 # 创建并运行容器,命令行在宿主机上
docker run -it --name=容器名字 镜像:标签 #创建并运行容器,命令行在容器内部
# 1 docker run 把镜像运行成容器
-docker run 参数
-i 表示运行容器
-d 以守护式容器在后台运行,用这个参数创建出来的容器,命令行还在宿主机上,没有进入到容器内部
-t 表示容器启动后会进入容器命令行。加入这参数后,容器创建就能登录进去。即分配一个伪终端。
--name 指定容器名字,如果不指定,会随机一个名字
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-v 表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
# 2 案例 -id
docker run -id --name=centos centos:7 # 执行完,命令在宿主机上,可以通过命令查看正在运行的容器
# 3 案例 -it
docker run -it --name=centos centos:7 # 执行完,命令行在容器内,容器很干净,几乎啥软件都没有,可以exit退出到宿主机---》只要退出,容器就停了
# 4 创建一个python3.9容器---》不进入
docker run -id --name=python python:3.9
# 5 启动一个centos容器并且进入,名字叫mycentos,在内部装个vim,然后退出
1 docker run -id --name=mycentos centos:centos7
2 在宿主机
3 docker exec -it mycentos /bin/bash # 新开了一个bash进程
4 yum install vim -y
5 exit
6 容器停还是没有停?没有,因为容器运行时的 bash 进程没有结束
# 6 重点:
如果创建容器并进入---》只要退出---》容器就停了
容器要运行,必须有个前台进程在运行,并且是夯住(阻塞)的,否则容器就停了
# 7 进入到容器内部
# 在容器上执行命令
docker exec 容器名字/id 命令
# 利用这个特性-->进入到容器内部
docker exec -it 容器名字/id /bin/bash
docker exec -it python sh
# 退出,结束掉 /bin/bash
exit
-v 映射操作
# 运行出一个 centos7 容器,不进入, 做目录映射
# 把宿主机的 /root/lqz文件夹 映射到 容器内部的 /zeng文件夹
# -v可以写多个,可以是文件或文件夹
1 cd # 回家 前提是你是root用户
2 mkdir zeng# 在root目录下创建zeng文件夹
3 运行容器,做目录映射
docker run -id --name=centos7 -v /root/zeng:/zengcentos:centos7
4 在宿主机的 /root/zeng 下新建 xx.txt
vim xx.txt
5 来到容器内部:看这个文件在不在
cat xx.txt
6 他们是相互影响的:
容器内部修改文件---》会影响外部
外部修改文件---》影响内部
# 目录映射好处是,后期咱们部署django项目
1 有个django容器,做好映射,代码放在宿主机上即可,以后更新了代码,只要重启容器,代码就是最新了
2 运行mysql容器---》mysql配置文件,数据data目录,放在宿主机上做好映射
如果 mysql容器---》表数据,放到容器中---》如果删了容器---》数据库全没了
表数据,放在宿主机上---》把容器删除---》表数据还在----》再启动一个容器做好映射---》数据都还在
-p 端口映射操作
# -p参数:端口映射 容器中启动一个mysql5.7 --》容器中的3306监听,宿主机3306没人监听,做端口映射后,宿主机的3306就被docker的这个容器监听了
# 启动的mysql的root密码是123456
# 启动mysql容器 -p 宿主机端口:容器端口
# 以后台守护进程运行mysql容器,mysql的root用户密码是123456,宿主机和容器做了端口映射
docker run -id --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# netstat -nlp |grep 3307 查看本机80端口占用情况
# 查看宿主机 3307端口占用情况
yum install net-tools -y
netstat -nlp | grep 3307 # 被docker占了
# 以后访问宿主机3307端口就等于访问容器的3306端口
# win机器可以远程链接 mysql
-命令行链接:mysql -h 10.0.0.110 -P 3307 -uroot -p
-Navicat: 链接,创建zeng数据库
-python:
# 宿主机--》进入到容器内部--》进入到mysql,查看有没有创建zeng这个库
docker exec -it mysql5.7 /bin/bash # 进入容器内部
mysql -uroot -p # 进入mysql
show databases; # 查看所有数据库
文件拷贝操作(宿主机执行)
# 容器的文件copy到宿主机上(不是在容器内执行)
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp 0a9633190cb9:/xx.txt /root/lqz/lqz.txt
# 宿主机的文件copy到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp /root/lqz/xx.txt 0a9633190cb9:/xx.txt
查看容器IP地址
docker inspect 容器名称 # 查看容器的详细描述,很多
docker inspect 0a9633190cb9 --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)