目录
昨日回顾
# 1 docker概念:
-版本(17.x以上,都是新版本),docker ce 和docker ee
-轻量级,环境问题(开发一套环境,运维一套环境)
-镜像和容器:镜像是一系列文件:redis镜像(linux系统+redis软件) 容器:当成操作系统
-隔离:容器里部署我的项目
-宿主机:运行docker软件的机器
-c/s架构:通过resful交互
# 2 镜像操作
-搜索镜像:docker search 镜像名字
-下载镜像:docker pull 镜像名字:tag # 如果不跟,默认下载最新的(******)
-查看本地镜像:docker images #(****)
-删除本地镜像:docker rmi 镜像id/镜像名字
docker rmi 4453 778 333
# 3 容器操作
-docker ps # 查看正在运行的容器
-docker ps -a # 查看所有容器(运行和停止)
-状态:创建,运行,停止,暂停
-启动和停止:dokcer stop 容器id/容器名字
-docker start 容器id/容器名字
docker容器与应用
1. 容器操作
操作id号的时候可以简写
docker rm f1 # 只写前两个或几个
# bash在等待用户输入命令
容器创建
docker create --name=容器名称
docker create -i --name=mycentos1 centos:7 /bin/bash
# 创建一个容器,执行的第一个命令是/bin/bash(就是新开了一个控制台)
# 创建一个容器,执行的第一条命令是/bin/bash 没有运行
docker create -it --name=mycentos1 centos:7 /bin/bash
# 如果后面跟的命令是一个能夯住的命令,容器在启动的时候,会一直运行,否则,容器一启动就停止
参数:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
容器运行
docker start 容器id/名字
容器创建并运行
docker run -id --name=mypython python:3.6 # 创建并运行,执行后台运行命令(/bin/bash)
docker run -it --name=mypython python:3.6 # 创建并运行,执行镜像的启动命令(退出就关闭了容器)
docker run -idt --name=mypython python:3.6 # 创建并运行(前台运行,相当于在容器内部)
- 在容器内部
- i表示运行,d表示执行镜像本身hang住的命令,-t表示使用/bin/bash 执行
进入容器
docker exex 命令(一般执行后台命令)
docker exec 464das4214 ps -a
docker exec 464das4214 python # 进入容器内的python
# 通过exec执行命令
# bash在等待用户输入命令
docker exec -it 464das4214 /bin/bash #执行bin/bash命令,连接到新的伪终端操作
# docker attach asdas442 了解,也是进入容器(连接到第一个进程上)
# ssh连接(容器安装ssh服务)
容器停止
docker stop id或名字
容器删除
docker rm id或名字
容器信息
docker inspect 名字/ID
过滤IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
文件拷贝
从容器到宿主机
docker cp 当前路径下文件 容器名/ID:容器路径
docker cp 1.txt mycentos:/home
从宿主机到容器
# 在宿主机中使用cp命令
docker cp centos7:/home/1.txt 1.txt
docker cp 容器名/ID:容器路径 当前路径
总结
docker run :创建并运行
docker exec : 容器执行命令(通常用来进入容器) docker exec -it 容器id/名字 /bin/bash
2. 网络卷和数据卷
目录挂载 -v
# 在宿主机的目录映射到容器,宿主机test文件夹映射到容器内部
docker run -id --name=mycentos -v /root/test/:/home centos:7
docker run -id --name=容器名 -v 宿主机文件夹:容器文件目录 基于镜像
端口映射 -p
docker run -id --name=myreids -p 6378:6379 redis
docker run -id --name=容器名 -p 宿主机端口:容器端口 基于镜像
# 同一个端口,只能被一个容器使用
3. 应用部署
在docker中部署项目服务(redis,mysql,Nginx)
# 部署mysql
1. 拉一个镜像
docker pull mysql:5.7
2. 运行启动容器
docker run -id --name=mymysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7 # -e设置mysql密码(不然是随机的root密码)
3. 进入mysql容器
docker exec -it mymysql /bin/bash
4. 使用mysql
mysql -uroot -p # 登录
# 数据库操作
4. 备份迁移
容器打包成镜像
# docker commit 容器名 新镜像名
docker commit centos7 my_centos7_image
镜像打包成压缩包
# docker save -o 压缩包名.tar 镜像名称
docker save -o centos_mt.tar my_centos7_image
压缩文件恢复镜像
# docker load -i 压缩包名称
docker load -i centos_mt.tar
5. Dockerfile
在Docker中创建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
常用命令
FROM image_name:tag
定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name
声明镜像的创建者
ENV key value
设置环境变量 (可以写多条)
RUN command
是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file
和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir
设置工作目录
创建镜像
创建文件Dockerfile
文件文件名,必须叫Dockerfile
输入指令
FROM python:3.6
MAINTAINER fw
RUN pip install django==1.11.9 -i https://pypi.doubanio.com/simple
RUN mkdir /home/fw
WORKDIR /home/fw
/*
基于的镜像
用户
执行的命令 安装django
执行的命令 创建文件夹
工作目录
*/
build构建镜像
docker build -t='django_img' .
# 构建出django_img 镜像(在当前目录中)
其他操作
查看创建后的镜像
docker images
制作容器
docker run -id --name=mydjango django_img
查看容器
docker ps
进入容器
docker exec -it mydjango /bin/bash
6.私有仓库
公司自己的镜像,放在私有仓库(公司内部使用)
私有仓库本质就是一个web项目(linux+registry(用其他语言写的一个web服务))
1.制作私有
1 docker pull registry # 拉取私有仓库registry镜像
2. docker run -di --name=registry -p 5000:5000 registry # 运行registry容器并对应端口
3. 浏览器访问可以直接访问 # 返回空 {"repositories":[]}
接口: http://10.0.0.200:5000/v2/_catalog
http://虚拟机地址:端口号/v2/_catalog
2. 修改仓库地址文件daemon.json
修改daemon.json
vi /etc/docker/daemon.json
# 添加文件内容:
# "insecure-registries":["端口的ip地址"]
"insecure-registries":["http://10.0.0.200:5000"]
修改之后:
{
"registry-mirrors": ["https://reg-mirror.qiniu.com"],
"insecure-registries":["http://10.0.0.200:5000"]
}
3. 启动服务
重启docker服务
所有容器都是停止状态
systemctl restart docker
启动registery容器
docker start registry
4. 镜像操作
标记镜像
# docker tag 镜像名 私有仓库地址ip/镜像名
docker tag django_img 10.0.0.200:5000/django_img
上传镜像 (私有仓库)
docker push 10.0.0.200:5000/django_img
浏览器继续访问
访问:http://10.0.0.200:5000/v2/_catalog
看到了上传的镜像:
{"repositories":["django_img"]}
以后只要同时配置了daemon.json,再拉取镜像,优先从私有仓库拉,没有在去国外