前言:
仓库 --镜像名--- 容器的关系
镜像存放在仓库里。
仓库——取出镜像——创建容器(可多个)——将项目/应用置于容器之中
一、docker的一些基本命令
如果是普通用户,记得再命令前面加上sudo哦!
docker version ----查看docker的版本信息
docker info ---查看docker的系统信息,包括镜像数量等
docker 命令 --help ----万能命令
二、镜像命令
- REPOSITORY 镜像的仓库源
- TAG 镜像标签
- IMAGE ID 镜像id
- CREATED 镜像的创建时间
- SIZE 镜像的大小
docker images ---- 查看所有镜像
docker images -a --- 列出所有镜像
docker images -q ----只显示镜像id
docker search mysql ---- 搜索mysql镜像
docker search mysql --filter=STARS=3000 --- 按照点赞数搜索mysql镜像[stars大小写都可 以]
docker pull mysql ---- 下载mysql镜像【默认为最新版本的镜像】
docker pull mysql:5.7 ---下载指定版本的mysql镜像
docker rmi -f c20987f18b13 --- 根据镜像ID删除镜像
docker rmi -f mysql ---根据镜像名删除指定镜像
docker rmi -f $(docker images -aq) ---批量删除所有镜像
docker images -a -q|xargs grep docker rmi -f --- 批量删除所有镜像的另一用法
三、容器命令
有镜像才能创建容器,这里我们可以选择下载ubuntu、centos等镜像去测试学习
docker pull ubuntu -----下载ubuntu系统镜像
docker run [可选参数] 镜像名 启动方式 --- 启动容器
docker run -it ubuntu /bin/bash ---用bash的方式启动并进入ubuntu容器之中
sudo docker run --name="ubuntu1" -it ubuntu /bin/bash
---新建名为ubuntu1的容器并启动进入容器
其他参数:
-d 后台方式运行
-it 使用交互方式运行,进入容器内查看内容
-p 指定容器端口
-p 8080:8080
-p ip 主机端口:容器端口 [常用的]
-p 容器端口
-P 随机指定端口
docker ps ---列出当前正在运行的所有容器
docker ps -a ---列出当前运行中的容器+历史运行过的容器
docker ps -n=1 -----显示最近创建的容器
docker ps -q ----只显示容器ID
docker ps -aq ----显示所有容器ID
exit ----停止运行容器并退出
ctrl+P+Q --退出容器但不停止运行
容器
docker rm 容器ID --- 根据容器id删除容器,正在运行的删除不了
docker rm -f $(docker ps -aq) ----删除所有容器,强制性删除,正在运行的也会被删除
docker ps -a -q | xargs docker rm --- 删除所有容器
docker start 容器id ---- 启动容器
docker restart 容器id ----重启容器
docker stop 容器id ----停止容器
docker kill 容器id ----强制停止当前容器
四、容器日志、进程信息的查看
后台启动容器
docker run -d ubuntu
查看日志:
docker logs -f -t --tail 5 容器id
-tf #显示日志[t是时间戳,]
--tail num #要显示的日志的条数
查看容器中的进程信息
docker top 容器id
查看容器/镜像的元数据
docker inspect 容器id或镜像id
五、进入当前正在运行的容器
通常容器是使用后台方式运行的,需要进入容器,修改一些配置!
方式一:
#exec -- 进入容器后,开启一个新的终端,可以再里面操作(常用)
docker exec -it 容器id /bin/bash ---it交互方式进入容器
方式二:
# attach 进入容器正在执行的终端,不会启动新的进程
docker attach 容器id
六、容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路经
docker cp dab125d3b201:/home/huanzi.php /home
七、提交镜像
想保存当前容器状态,可通过commit 提交,将获得一个镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[tag]
docker commit -a="shh_ye" -m="add webapps app" 容器id tmcat02:1.0
案例:
docker run -d -P --name tomcat01 tomcat
docker exec -it tomcat01 /bin/bash
apt-get update
apt-get install -y iproute2
apt-get install -y iputils-ping
ctrl+P+Q
docker ps
docker commit -a="shh_ye" -m="add iproute2 iputils-ping" 2e2859d531f3 tomcat:1.0
docker images
docker rm -f 2e2859d531f3
docker run -d -P --name tomcat01 tomcat:1.0
八、容器数据卷
方式一:指定路径挂载 --双向绑定
docker run -it -v 主机目录:容器内目录
docker inspect 容器id ---寻找mounts查看是否挂载成功
方式二:匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx
方式三:具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume inspect juming-nginx ---查看具名挂载目录的具体地址
docker volume ls ---查看所有的卷的情况
所有的docker容器内的卷,没有指定目录下的情况下都是在 /var/lib/docker/volumes/XXXX
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
数据卷容器:
#启动自己生成的镜像
docker run -it --name docker01 huan/ubuntu:1.0
docker run -it --name docker02 --volumes-from docker01 huan/ubuntu:1.0
docker ps
docker attach 容器01id
cd volume01
touch test.txt
docker attach 容器02id
cd volume01
ls -----可以看到容器01新建的文件在容器2内可以看到!!!
双向拷贝的概念,多用于多个mysql实现 数据共享!
九、DockerFile
dockerfile -- 用来构建docker镜像的文件,命令参数脚本
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 【运行镜像】
4、docker push 发布镜像【dockerHub、阿里云】
1、每个指令都必须大写!!
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
FROM #基础镜像, ---一切从这里开始 [这个镜像的妈妈是谁?]
MAINTAINER #镜像是谁的,姓名+邮箱 [告诉别人,谁负责维护它]
RUN #镜像构建的时候需要运行的命令[你想让它干啥]
ADD #步骤:tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像的工作目录
VOLUME #设置容器卷,挂载到那个位置
EXPOSE #指定暴露的端口,端口配置
CMD #指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承Dockerfile 这个时候就会运行 ONBUILD的指令。触发指令 COPY #复制,类似ADD命令,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
创建一个自己的ubuntu
1、编写dockerfile文件
cd /home/dockerfile
vim mydockerfile
FROM ubuntu ---基础镜像是ubuntu
MAINTAINER shh_ye<shh_ye@163.com> ----作者名
ENV MYPATH /usr/local ---配置根目录是/usr/local
WORKDIR $MYPATH ----工作目录
RUN apt-get update
RUN apt-get -y install vim ---镜像构建时要执行的命令
RUN apt-get -y install net-tools
EXPOSE 80 ---暴露端口号
CMD echo $MYPATH ---容器启动时执行 的命令
CMD echo "----end----"
CMD /bin/bash
2、生成镜像
docker build -f dockerfile文件路径 -t 镜像名:版本号
docker build -f mydockerfile -t myubuntu:0.1 . #-f指定文件路径 -t指定镜像名 ,后面还有个.
Successfully built c9031a71d605
Successfully tagged myubuntu:0.1
3、测试运行
docker images ----- 查看镜像
docker run -it myubuntu:0.1 ----启动镜像
进入容器,可看到进入了自己的工作目录 /usr/local
ifconfig --- 查看网络信息
vim test.php 也可以
十、Docker网络详解
ip addr
lo --- 本机回环地址
docker0 --- docker地址
enp1s0 ---阿里云内网地址
docker0 ---docker启动就会有的网络,docker自带的
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡 docker0桥接模式,使用的技术就是 evth-pair技术!
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02
--linke可以实现网络单向连通!! 即tomcat03 可以pingtomcat02,但反过来就不行!
--linke就是我们在hosts配置中增加了一个172.17.0.2 tomcat02
docker network ls ---查看所有网络
docker network inspect 网络名 ---查看某一个网络的具体信息
自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network inspect mynet
docker run -d -P --name tomcat-net-02 --net mynet tomcat
docker network inspect mynet
# 无论是容器名字还是ip地址,都是可通的!
docker exec -it tomcat-net-01 ping 192.168.0.3
docker exec -it tomcat-net-02 ping 192.168.0.2
docker exec -it tomcat-net-01 ping tomcat-net-02
#实现一个容器与一个网络的连通!
docker network connect mynet tomcat01
docker network inspect mynet
本质:
连通之后就是将tomcat01放到了mynet网络下!
一个容器两个ip地址,阿里云服务,一个公网ip,一个私网ip
假设要跨网络操作别人,就要使用docker network connect 连通!!
网络模式:
- bridge桥接模式: 0.1是桥,0.2和0.3可以联系(默认,自己用的也是)
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络互联通!(用的少,局限性很大)
十一、总结
docker version --- 查看doc版本ker版本
docker info ----查看docker系统信息
docker images
docker pull ubuntu
docker search ubuntu
docker images -a -q
docker rmi ubuntu
docker rmi -f ubuntu
docker rmi -f $(docker images -aq)
docker run --name ubuntu01 -it ubuntu /bin/bash
docker run -d -p 8080:8080 --name ubuntu01 ubuntu
docker ps
docker ps -a
docker exec -it ubuntu01 /bin/bash
docker attach ubuntu01
docker top 容器id
docker inspect 容器id
docker cp 容器id:容器内地址 宿主机地址
docker logs -f -t --tail 5 容器id
exit
ctrl+P+Q
docker rm 容器id
docker rm -f 容器id
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm -f
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
docker run -e修改配置文件信息
docker commit -a="shh" -m="add file" 容器id tomcat:1.0
docker run -it -v 主机目录:容器内目录
docker run -d -P --name nginx01 -v /etc/nginx nginx
docker run -d -P --name nginx02 -v jumping-nginx:/etc/nginx nginx
docker volume inspect jumping-nginx
docker volume ls
docker run -it --name docker02 --volumes-from docker01 ubuntu:1.0
docker build -f dockerfile -t myubuntu:0.1 .
docker run -it myubuntu:0.1
docker network ls
docker network inspect 网络名
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker run -d -P --name tomcat-net-01 --net mynet tomcat
后记:docker学习中最为重要的就是某个命令加--help!!