Docker基本命令
Docker镜像基本命令
搜索镜像命令
- 搜索镜像nginx
docker search nginx
; - 搜索官方提供的nginx镜像
docker search --filter "is-official=true" nginx
; - 搜索自动化构建的nginx镜像
docker search --filter "is-automated=true" nginx
- 搜索大于等于3颗星的nginx镜像
docker search --filter stars=3 nginx
下载镜像nginx
docker pull nginx
本地镜像查看
docker images
本地镜像nginx删除
docker rmi nginx
附:镜像加速
配置阿里云容器镜像加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
容器的基本操作
容器创建
docker run -itd --name=container_name image_name/镜像id
- -i 表示以交互模式运行容器
- -d 表示后台运行容器, 并返回容器id
- -t 为容器重新分配一个伪输入终端
- –name为容器指定名称
- 注意: 一个镜像可以创建多个容器,只要名字不一样就可以
查看容器
- 查看容器(运行中的)
docker ps
- 查看容器(包括已停止的)
docker ps -a
停止容器
docker stop container_name/container_id
启动容器
docker start container_name/container_id
重启容器
docker restart container_name/container_id
删除容器
docker rm container_name/container_id
注意: 删除容器需要先停止容器
进入容器
docker exec -it container_name/container_id /bin/bash
退出容器
exit
容器提交修改
docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name
参数说明
- -a:参数可选,用于指定作者,可以写你的名字
- -m:参数可选,提交信息,可以说一下你做了哪些修改
- container_id:该参数为被修改的容器ID
- new_image_name:此为新镜像的名字,可自定义
- tag_name:此为新镜像的标签,可不写,不写时标签默认为latest
- 修改完,停掉容器,重新启动,修改的内容还在;
- 容器删除了,再次通过镜像创建容器,如果没有把容器修改内容保存到镜像中,再次创建的容器没有修改的内容;
- 每个容器都很干净的,里面没有多余的命令,需要自己安装;
端口映射
解决的是客户端发送过来的请求和容器之间的交互
docker run -itd -p 宿主机端口号:容器端口号 + 镜像名字/镜像id
文件挂载
- 解决的是宿主机和容器之间的交互
- 文件挂载和复制都要用绝对路径
docker run -itd -v /宿主机/文件目录/文件名:/容器/目录/文件名
eg:docker run -itd --name=nginx -p 80:80 -v /wwwroot/html:/usr/share/nginx/html nginx
docker run -itd --name=nginx -p 80:80 -v /wwwroot/:/usr/share/nginx/html/ 584256c85bdd
- 文件挂载的意义: 本地代码或者文件通过容器挂载的方式,放到容器里面,交由其来运行;
文件复制
文件挂载和复制都要用绝对路径
将容器的文件复制到本地
docker cp 容器名:/容器目录/文件名 /宿主机目录/文件名
将本地的文件复制到容器
docker cp /宿主机目录/文件名 容器名:/容器目录/文件名
容器互联
解决的是容器与容器之间的交互
docker run -itd --link 被关联的容器名字:被关联的容器的别名
Docker容器理论沉淀
- docker的容器,容器启动之后,会自动运行容器里面的服务;类似nginx, nginx启动之后,我们会得到一个运行nginx软件的虚拟机; nginx是运行在容器里面的,对外提供服务的是我们的服务器, 这里的服务器可以理解为我们的***宿主机***;
- 给用户提供的访问,是宿主机在提供,而不是容器再提供,那我们怎么把用户的请求,请求到宿主机之后,自动分配给容器呢?
这个就是端口映射的操作;
- 端口映射就是把宿主机的80端口和容器的80端口两者之间关联起来;用户的所有请求到了宿主机的80端口就会自动被转发到容器的80端口;这样一来,我们所有的http请求到了宿主机之后,就会被容器里面的nginx接收到进行处理;
- docker里面的容器, 每一个容器都提供一种服务; 它不是一个容器里面提供所有的服务; 我们不会在一个服务里面, 把php, mysql, nginx都装进去, 为什么呢?
分开装的好处便于切换版本, 不需要动环境的东西,只需要装一个新版的容器, 切换一下容器就可以了;
安装mysql和php容器
- 因为mysql可以单独运行, 但php的运行依赖mysql,所以先启动一个mysql的容器;
- 因为数据比较重要,所以启动mysql容器需要挂在目录到本地持久化,容器里面数据变化,本地也会变化,这样容器出问题后,只要删除容器,重新挂载一下本地目录就可以了,文件数据不会丢失;
docker run -itd --name=mysql -p 3306:3306 -v /wwwroot/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 mysql
- 此时,本地工具连接mysql报错,提示"caching_sha2_password" 这是mysql8的一个特点,需要安装一个插件,我们此时需要对mysql密码进行重新设置
- -e MYSQL_ROOT_PASSWORD=123456 启动容器的时候,往里面传参,设置mysql的root密码
- 修改mysql密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
在mysql中修改root密码,任意地址可连接
- 启动php容器
docker run -itd --name=php --link mysql:mysql -v /wwwroot/php/index.php:/index.php php
- 把index.php挂载到容器根目录里中
- docker安装pdo扩展
docker-php-ext-install pdo_mysql
- 注意:容器互联之后,host地址不用 ip地址了, 用关联时候命令的容器别名或者ip替代ip就可以