Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境
Docker官方文档比较全:官方文档
Docker中有三个核心概念:镜像、容器和仓库。因此,准确把握这三大概念对于掌握Docker技术尤为重要
镜像:启动容器的模板
容器:对外提供服务的实例
仓库:存放镜像仓库
Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等
用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来
在CentOS系统上安装Docker
Docker目前支持CentOS7及以后版本。系统的要求跟Ubuntu情况类似,64位操作系统,内核至少是3.10以上
# 备份原来YUN源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 运行 yum makecache 生成缓存
yum makecache
yum update -y --exclud=kernel*
# 已加载插件: fastestmirror
# Loading mirror speeds from cached hostfile
# * base: mirrors.aliyun.com
# * extras: mirrors.aliyun.com
# * updates: mirrors.aliyun.com
# ...
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
systemctlenable--nowdocker
dockerinfo
镜像是运行容器的模板,官方DockerHub仓库已经提供了许多镜像共开发者使用。如果我们需要获取某个镜像则可以去docker仓库下载所需的镜像
下载镜像的格式: docker pull [仓库的URL]/[名称空间]/[仓库的名称]:[版本号]
# 以获取redis为例
docker pull redis
默认: docker pull docker.io/library/redis:latest
docker pull registry.cn-hangzhou.aliyuncs.com/xxx/python:v5
镜像主要包括镜像文件、镜像tag以及镜像详细信息等
两种方式:
docker images
docker image ls
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# redis latest 74d107221092 12 days ago 104MB
# 参数说明
REPOSITORY: 镜像名称
TAG: 镜像版本号
IMAGE ID: 镜像ID
CREATED: 创建时间到现在的时间
SIZE: 指镜像大小
image子命令主要支持如下选项:
docker images -a: 列出所有(包括临时文件)镜像文件
docker images --digests: 列出镜像的数字摘要值
docker images -q: 仅显示ID信息
docker tag [原镜像名称]:[版本号] [新的名称]:[新版本号]
例: docker tag redis:latest registry.cn-hangzhou.aliyuncs.com/xxx/redis:v1
# 登录阿里云仓库
docker login [参数] [仓库URL]
docker login --username=阿里云的用户名 registry.cn-hangzhou.aliyuncs.com
# 会提示输入密码,密码输入成功即登录成功
# 推送命令(将刚才打好tag的镜像推送到远程服务器)
docker push [镜像名称]
例: docker push registry.cn-hangzhou.aliyuncs.com/xxx/redis:v1
使用dockerinspect命令获取镜像的详细信息,包括PID、作者、架构等
docker inspect [参数] [镜像ID]|[镜像名称]:[版本号]
例: docker inspect redis
docker inspect -f "{{ .Id }}" redis
docker inspect -f "{{ .ContainerConfig.Hostname }}" redis
docker history [镜像名称]|[镜像ID]
例: docker history redis
docker search [参数] [镜像名称|镜像简介]
docker search redis
# NAME DESCRIPTION STARS # OFFICIAL AUTOMATED
# redis Redis is an open source key-value store that… 8792 # [OK]
# bitnami/redis Bitnami Redis Docker Image 168 [OK]
#sameersbn/redis 82 [OK]
NAME: 镜像名称
DESCRIPTION: 简介
STARS: 收藏个数
OFFICIAL: 是否是官方镜像
AUTOMATED: 是否是自构建的镜像
# limit n: 只显示n条记录
例: docker search redis --limit 3
# -f: 过滤查询
stars=150: 查询收藏数大于150的镜像
例: docker search redis -f stars=150
# --no-trunc: 不截断查询
例: docker search redis -f stars=150 --no-trunc
在docker中,删除镜像主要使用rmi子命令,清理镜像主要使用prune子命令
docker rmi [镜像ID|[镜像名称:版本号]]
docker images # 查看镜像
# REPOSITORY TAG IMAGE ID CREATED SIZE
# redis latest 74d107221092 12 days ago 104MB
# registry.cn-hangzhou.aliyuncs.com/alvinos/swoole hyperf-php72-swoole45 560f3f47e448 3 months ago 85.9MB
docker rmi 74d107221092
# Untagged: redis:latest
# Untagged: redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
# Deleted: sha256:74d107221092875724ddb06821416295773bee553bbaf8d888ababe9be7b947f
# Deleted: sha256:d951b383737320b4e1ac7f9bb63f3919bcf25363ccb59fbb52a41e45ba70ffdd
# Deleted: sha256:d3b2581a1c92973ee9a41fc00e5628047ce7e644a66240fb859b38831bd525b4
# Deleted: sha256:a447231da503a58432b4d7409980139206fdf398fbde189d8a7229dd0663f472
# Deleted: sha256:f786204ca260bcaef3d47ecad10821878028239072c65ceb2a1f212f275f9367
# Deleted: sha256:b68afce5f52461f79be59806be00e43ea95152a0358b8dc5de9ac3f486a70d7e
# Deleted: sha256:f5600c6330da7bb112776ba067a32a9c20842d6ecc8ee3289f1a713b644092f8
# -f: 强制删除
如果该镜像正在使用中,强制删除,实际上是删除标签
# 清理镜像
docker image prune [参数]
-a: 清理所有的(未被使用)镜像
docker commit [容器ID] [参数]
-a: 作者信息
-m: 提交信息
-p: 提交时,暂停容器运行
# 以redis为例,启动
docker run -d redis
# 查看
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# e9e1148d5369 redis "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 6379/tcp festive_dewdney
# 保存容器为镜像,并指定名称和版本号
docker commit -a "allen" -m "详细信息" e9e1148d5369 redis:v1
# 此时查看,第一条就是我们刚才创建保存的
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# redis v1 b528540b5b79 7 seconds ago 104MB
# redis latest 74d107221092 12 days ago 104MB
查看正在运行的容器
docker ps
查看所有容器
docker ps –a
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
创建容器常用的参数说明:
创建容器命令: docker run
注意: docker run 镜像 如果本地没有,会先pull,再run
创建: docker create --name=xxx redis
docker create --name=test-container centos:centos7 ps -A
启动: docker start test-container
容器一直运行的原因
(1)它有一条前台进程,一直在运行
(2)以后如果自己制作的镜像,运行起容器,必须有个可以夯住的命令
(3)如果该命令结束,该容器也就结束了
-i: 表示运行容器
-t: 表示容器启动后会进入其命令行,加入这两个参数后,容器创建就能登录进去,即分配一个伪终端
--name: 为创建的容器命名
-v: 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射,注意: 最好做目录映射,在宿主机上做修改,然后共享到容器上
-d: 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)
-p: 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态
退出当前容器
exit
docker run -di --name=容器名称 镜像名称:标签
登录守护式容器方式
docker exec -it 容器名称 (或者容器ID) /bin/bash
停止容器
docker stop 容器名称(或者容器ID)
启动容器
docker start 容器名称(或者容器ID)
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器
创建容器 添加-v参数 后边为 宿主机目录:容器目录
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器ID)
也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
删除指定的容器
docker rm 容器名称(容器ID)
# 在容器内部署mysql
# -e表示环境变量
docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 官方提供的
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 在容器内部署redis
docker run -di -p 6377:6379 redis:latest
# 在容器内部署nginx
docker run -di --name=mynginx -p 8080:80 nginx
1、mkdir /reids /redis/conf /redis/data
2、vim /redis/conf/redis.conf
# 配置文件
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456 # 指定redis登录密码
3、创建并运行容器,目录映射
docker run -p 6378:6379 --name redis_6379 -v /redis/conf/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -di redis redis-server /etc/redis/redis.conf
4、本地window机器上远程连接到了docker里的redis
5、cmd窗口下
redis-cli -h 101.133.225.166 -p 6378
6、认证
auth 123456
7、写入数据
set name allen
8、保存数据
save或者是bgsave
9、在宿主机的/redis/data路径下就能看到一个文件
10、不管多少次重启redis容器,数据都还在
11、原来的redis容器没了,按照第三步再启动一遍数据都还在
1、启动一个python容器
docker run -di --name=mypython python:3.6
2、进入容器中安装django
docker exec -it mypython /bin/bash
mkdir /project
pip install django==1.11.1
3、把宿主机项目拷贝到容器内部
docker cp /opt/data/django_test mypython:/project
4、把容器做成镜像
docker commit mypython mydjango
5、基于自己做的镜像运行容器
docker run -id --name=mydjango -p 8088:8088 mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
把镜像打包成压缩包
docker save -o xxx.tar 镜像名称
把压缩包恢复为镜像
docker load -i xxx.tar
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
1、对于开发人员: 可以为开发团队提供一个完全一致的开发环境
2、对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
3、对于运维人员: 在部署时可以实现应用的无缝移植
命令 | 作用 |
---|---|
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 | 设置工作目录 |
mkdir –p /usr/local/dockerdjango
# 依赖镜像名称和ID
FROM python:3.6
# 指定镜像创建者信息
MAINTAINER TEST
# 切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/mydocker
RUN pip install==1.11.9
ENV PATH $JAVA_HOME/bin:$PATH
docker build -t='django1.11.9' .
注意后边的空格和点,不要省略
docker images
1、定义Dockerfile
vim Dockerfile,内容如下:
FROM python:3.6
MAINTAINER allen
EXPOSE 8080
ADD ./requirement.txt /home/
RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/
RUN pip install uwsgi -i https://pypi.douban.com/simple/
VOLUME ['/home']
WORKDIR /home/django_test
CMD python manage.py runserver 0.0.0.0:8080
2、通过dockerfile构建出镜像
docker build -t="mydjango_1.11.11" .
3、启动容器
docker run --name=mydjango_test -p 8888:8080 -v /root/dj_test:/home/django_test -id mydjango_1.11.11
4、在浏览器中访问
http://192.168.12.80:8888/
docker pull registry
docker run -di --name=registry -p 5000:5000 registry
vi /etc/docker/daemon.json
添加以下内容,保存退出
{"insecure-registries":["ip地址:5000"]}
此步用于让 docker信任私有仓库地址
systemctl restart docker
docker tag django2.0 ip地址:5000/django2.0
docker start registry
docker push ip地址:5000/django2.0