概念理解:
docker是为了干什么:为了把项目的环境、代码一起打包复用,免于环境不同导致的各种依赖问题。
镜像就是把自己已有的环境、代码进行打包,变成一个镜像文件,可以认为它是个母体(比如蚁后);因为蚁后自身不具备战斗力,所以其他人下载这个镜像文件后,它是无法直接使用的,要先让让蚁后生一个兵蚁,也就是docker run 指令产生一个容器,产生的容器就包含了镜像的各种环境,无需安装就能使用。
镜像和容器的关系理解:
docker run -it --name bee1 IMAGE /bin/bash # 名叫bee1的容器从名叫image的镜像中生成了
bee1:我出生了,我的妈妈是IMAGE
docker run -it --name bee2 IMAGE /bin/bash # 名叫bee2的容器从名叫image的镜像中生成了
bee2:我也出生了,虽然我的妈妈也是IMAGE,但是我和bee1没关系,我俩各管各的
docker run -it --name bee1 IMAGE /bin/bash # 名叫bee1的容器又一次从名叫image的镜像中生成了
旧bee1:纳尼?新出生的那小子也叫bee1??那我死了哈! # 旧bee1会被杀死,容器中的缓存会丢失
新bee1: 我又出生了,我的妈妈又是IMAGE,等等,我为什么要说“又”?
docker run -it --name bee3 IMAGE2 /bin/bash # 名叫bee3的容器又一次从名叫image2的镜像中生
bee3:我出生了,我的妈妈是IMAGE2。bee1、bee2是谁?我不认识,我只认识我妈。
安装环境Ubuntu16.04
准备项:——————————————————————————————————
安装前检查:
内核版本
uname -a
存储驱动(Device Mapper):查看该文件是否存在
ls -l /sys/class/misc/device-mapper
检查无误后选择安装安装ubuntu维护的版本或docker维护版本
安装ubuntu维护的版本:
(sudo apt-get upgrade) 更新apt-get
sudo apt-get install docker.io
source /etc/bash_completion.d/docker.io 更新配置
sudo docker -version # 查看版本号以确认是否安装成功
安装docker维护版本:
检查apt的https协议支持情况,查看/usr/lib/methods/https文件是否存在
若不存在,则直接安装
apt-get update
apt-get install apt-transport-https
添加docker的地址到apt命令列表中
echo deb https://get. docker. com/ubuntu docker main > /etc/apt/sources. Iist. d/docker. list
添加仓库的key (GPG秘钥)
apt-key adv --keyserver hkp://keyservers. ubuntu. com:80 --recv-keys
58118E89F3A912897C070ADBF76221572052609D
安装Docker
apt-get update
apt-get install - y Ixc-docker
docker -version 查看版本号来确认是否安装成功
将非root用户加入用户组
使用非root用户:
sudo groupadd docker 添加名字为docker的用户组
sudo gpasswd -a {user} docker 将当前用户添加到该用户组中
sudo service docker restart 重启docker服务
退出账户并重新登录
准备工作完成————————————————————————————————
常用命令——————————————————————————————————
镜像:
查看
docker images
docker images -a #显示所有镜像
docker images *词条* #显示名称中包含“词条”的镜像
docker images -q #只显示镜像唯一ID
docker inspect 名称:TAG #查看镜像中的内容
搜索
docker search {ubuntu} #从dockerhub搜索包含ubuntu的镜像
下载和删除
docker pull {ubuntu:lastest} #拉取镜像名称为ubuntu的镜像到本地镜像,默认TAG为lastest,或者可以指定比如ubuntu:18.04
docker rmi {ubuntu:lastest}或者imageID #删除
容器:
查看
docker ps #查看当前正在运行的容器
docker inspect {容器ID}或者{容器名称} #返回当前容器详细信息
启动
docker run -it IMAGE /bin/bash #从一个叫IMAGE的镜像启动一个容器,不取名的话会默认随机容器名
docker run -it --name {new_name} IMAGE /bin/bash #启动容器并取名
注意!!启动容器最好取名,否则如果正好默认名字和其他容器冲突,会杀死之前的容器
-i 告诉docker的守护进程始终打开标准输入
-t 告诉docker为容器创建一个tty的终端,提供一个交互式shell
容器中exit就可以退出容器
停止
docker kill 容器名 #停止一个启动中容器,但是不会删除它
重启
docker exec -it 容器ID /bin/bash #再次进入一个已启动的容器(并打开bash命令行),exec重进容器必须带启动命令(如/bin/bash,python3)否则会报错
删除
docker rm 容器名 # 彻底删除一个停止运行的容器
dockerfile:
docker镜像的描述文件,docker能读取dockerfile中的指令自动构建新的镜像
需要注意:每个指令在制作镜像时都会创建一个镜像层,镜像层越多,效率越低。因此一个指令能完成的动作尽量不要分多个指令定义
关键字:
FORM #指定基础镜像
MAINTAINER #作者信息
RUN #执行什么命令
EXPOSE #容器对外暴露的端口
WORKDIR #该镜像启动容器后,进入容器后进入到哪个目录
ENV #配置环境变量
ADD #将文件拷贝到镜像中并自动解压
COPY #将文件拷贝到镜像中
VOLUME #配置数据卷(目录挂载)
CMD #容器启动时候执行的命令
ENTRYPOINT #容器启动时候执行的命令
案例:
ls
Dockerfile hello.py # 确认当前路径下有Dockerfile文件,hello.py则是你要加入镜像的代码文件
FROM ubuntu #指定要生成的镜像的基础镜像,开头第一句话必须也只能是FROM
MAINTAINER zb1312065xxxx@163.com #指定作者是谁
RUN apt-get update #执行apt-get update进行apt-get更新
RUN apt-get install vim -y #执行 apt-get install vim -y 命令,安装vim
RUN mkdir /home/data #执行mkdir /home/data创建文件夹
COPY hello.py /home/data/hello1.py #执行cp hello.py /home/data/hello1.py 复制并重命名文件,无法执行会报错
WORKDIR /home/zb #启动容器后,如果启动交互模式,直接进入到/home/zb
CMD ["/bin/bash"] #启动容器的时候,进入到/bin/bash这种命令行
基于dockerfile创建新的镜像
docker bulid -t 新的镜像名:TAG 上下文路径
docker build -t ubuntu:zb18.04 . #最后一个点是表示:上下文路径为当前路径,即dockerfile指令行中涉及到路径的命令,其起始路径从当前路径开始
docker build -t 新的镜像名:TAG -f Dockerfile路径 上下文路径 # 通过其他路径的dockerfile创建镜像
docker build -t ubuntu:lastdata_zb -f home/zb/Dockerfile home/data/
指定这个位置的Dockerfile 指定上下文路径为/home/data,则Dockerfile中的诸如COPY指令会从/home/data路径开始搜索文件并执行操作
创建完镜像后,它就会变成一个本地镜像,可以使用docker images 等指令查询,然后用docker run等质量来启动它。
然后打包镜像就可以把它从服务端上下载下来进行移动了
docker save -o <filename>.tar <image_name>:<tag>
自定义 镜像名 镜像TAG
ls
<filename>.tar