上节课回顾与复习
镜像命令:
docker search #搜索镜像
docker pull/push #下载/上传镜像
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker tag #源镜像名 新镜像名
docker rmi #删除镜像
docker image prune #移除没有标签并且没有被容器引用的镜像,dangling(摇晃)镜像
示例:
Tomcat镜像获取:[root@docker-01 ~]# docker pull tomcat
添加新的标签:[root@docker-01 ~]# docker tag tomcat:latest tomcat:v1
删除镜像rmi -f:不建议用id号删除,一般用名称加标签删除
[root@docker-01 ~]# docker rmi -f tomcat:latest
容器管理命令
docker run 镜像 #新建容器并启动 (-i -t -d -p -P -v --net --name)
docker ps #列出正在运行的容器
docker ps -a #列出所有容器(包括运行的和停止的)
docker ps -aq #列出所有容器ID(-q只列出ID)
docker ps -aqf “status=exited” #过滤出所有停止的的容器(exited小写)
docker ps -aqf “status=created” #过滤出所有停止的的容器(created小写)-f: filter过滤
docker rm 容器id #删除指定停止的容器
docker rm -f 容器id #删除指定运行的容器
docker rm -f $(docker ps -aq) #删除所有容器 -f:force
docker container prune #删除所有已停止的容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker logs 容器id #查看容器日志
docker inspect 容器id #查看容器详细信息
docker exec -it 容器id /bin/bash #进入启动的容器
docker cp 容器id:路径 宿主机路径 #宿主机与容器间复制文件,双向
docker cp 宿主机路径 容器id:路径 #宿主机与容器间复制文件,双向
示例:
- Docker run命令示例
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
注意:运行容器时一定要加/bin/bash进入终端!!!
- 宿主机的80端口被占用,再次运行80端口时会报错说端口已占用,且容器不会运行
运行一个新容器:
[root@docker-01 ~]# docker run -d -p 80:80 nginx
真实机浏览器访问http://192.168.10.11:80 #访问宿主机端口
再次运行此容器:出现端口被占用的情况
[root@docker-01 ~]# docker run -d -p 80:80 nginx #宿主机端口:容器端口
解决方法:如果有80端口被占用,容器不会被运行,可更换冒号前的端口
[root@docker-01 ~]# docker run -d -p 81:80 nginx #宿主机端口:容器端口
真实机浏览器访问http://192.168.10.11:81 #访问宿主机端口
- Dokcer cp命令示例
使用docker cp命令发布做好的nginx网页
[root@docker-01 ~]# docker run -d -p 80:80 nginx:1.20
[root@docker-01 ~]# docker ps
[root@docker-01 ~]# docker exec -it 6c2941f69314 /bin/bash
客户端浏览器访问http://192.168.10.11
在宿主机上编辑一个index.html文件,复制到容器中
echo “test-page” > index.html
[root@docker-01 ~]# docker cp index.html 6c2941f69314:/usr/share/nginx/html/index.html
客户端浏览器访问http://192.168.10.11
- Docker rm命令示例
docker images
docker rm 容器id #删除某个Exited状态的容器
docker container prune #删除所有Exited容器
docker rm -f $(docker ps -aq) #删除所有容器 -f:force
=================================================================================
本章内容
制作镜像的方法:
10.11主机上准备nginx镜像:
10.11主机上备份nginx镜像并拷贝给10.12的主机
[root@docker-01 ~]# docker save -o nginx.tar nginx:latest
[root@docker-01 ~]# scp nginx.tar root@192.168.10.12:/root
10.12主机上导入镜像:
[root@docker-02 ~]# systemctl start docker
[root@docker-02 ~]# ls
anaconda-ks.cfg nginx.tar
[root@docker-02 ~]# docker load -i nginx.tar
[root@docker-02 ~]# docker images
制作容器的方法:
基于cnetos镜像运行一个容器:
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
在容器中创建一个新文件:[root@eccdc1476ed2 /]# touch testfile
查看容器:[root@docker-01 ~]# docker ps
导出容器:[root@docker-01 ~]# docker export eccdc1476ed2 > centos7_v1
拷贝容器到主机10.12:
[root@docker-01 ~]# scp centos7_v1 root@192.168.10.12:/root
10.12主机上导入镜像:
[root@docker-02 ~]# docker import centos7_v1 centos:v1
使用镜像运行容器:
[root@docker-02 ~]# docker run -it centos:v1 /bin/bash
[root@885ae9e3a9f1 /]# ls
容器导出后是镜像
通过容器保存为本地镜像:
容器中可以使用yum命令说明运行容器前已经配置好yum源了,容器中不可以使用命令yum也没关系,使用正确的方式退出容器,然后配置yum源就可以了。
一台主机上部署:
基于centos:7运行一个容器:
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
[root@f427b815dcee /]#
容器内安装httpd软件:
现在容器中配置好阿里源(centos源和epel源):
[root@f427b815dcee /]# cd /etc/yum.repos.d/
[root@f427b815dcee yum.repos.d]# mv * tmp
先下载centos源,再下载wget:yum -y install wget
最后下载epel源
[root@f427b815dcee /]# yum -y install httpd
通过容器保存为本地镜像:
[root@docker-01 ~]# docker commit -m "centos7_install_httpd" -a zyjy f427b815dcee centos7_httpd:v1
查看镜像:[root@docker-01 ~]# docker images
使用新镜像运行容器:
[root@docker-01 ~]# docker run -it centos7_httpd:v1 /bin/bash
[root@ccb780a72a83 /]#
查看是否有httpd软件:
[root@ccb780a72a83 /]# rpm -qa|grep httpd
两台主机上部署:
通过dockerfile生成本地镜像:
基于dockerfile创建(主要包含四部分):
基础镜像信息:FROM
维护者信息: MAINTAINER
镜像操作指令: RUN
容器启动时执行的指令: CMD
使用Dockerfile生成镜像:(在Dockerfile文件所在目录)
docker build -t 新的镜像名称 .
示例:使用dockerfile生成nginx镜像
做一个nginx网页:
[root@docker-01 ~]# mkdir nginxdir
[root@docker-01 ~]# cd nginxdir/
[root@docker-01 nginxdir]# vim index.html
保存退出
编写dockerfile文件:
[root@docker-01 nginxdir]# vim dockerfile
添加:
FROM centos:7
MAINTAINER "ydw@163.com"
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx
保存退出
生成镜像:[root@docker-01 nginxdir]# docker build -t nginx:v5 .
查看镜像:[root@docker-01 nginxdir]# docker images
使用新的镜像运行容器:
[root@docker-01 ~]# docker run -d -p 80:80 nginx:v5
查看镜像:
真实机浏览器访问:
课后实验
实验一:
- 通过cenos:7、nginx:1.20镜像运行几个容器
方法一:先拉取镜像,再运行容器
[root@docker-01 ~]# docker pull centos:7
[root@docker-01 ~]# docker images
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
[root@docker-01 ~]# docker ps
方法二:直接运行容器,同时会自动下载镜像
[root@docker-01 ~]# docker run -it nginx:1.20 /bin/bash
[root@docker-01 ~]# docker ps
教学答案:
docker run -it -p 80:80 --name centos_nginx nginx:1.20 /bin/bash
docker run -itd --name centos7 centos:7 /bin/bash
- 进入不同容器,分别使用exit和ctrl-p+q方式退出
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
[root@fa9aa3ee81ea /]# exit
[root@docker-01 ~]# docker run -it nginx:1.20 /bin/bash
root@f6b14cc5db87:/# [root@docker-01 ~]#
教学答案:
docker exec -it centos_nginx /bin/bash
docker exec -it centos_nginx /bin/bash
- 查看容器状态
[root@docker-01 ~]# docker ps -a
- 删除不同状态的容器
删除停止的容器:[root@docker-01 ~]# docker rm fa9aa3ee81ea
删除正在运行的容器:[root@docker-01 ~]# docker rm -f f6b14cc5db87
查看容器是否删除成功:[root@docker-01 ~]# docker ps -a
docker container prune#删除所有Exited容器
实验二:
- 用nginx:1.20镜像运行容器,分别以-p和-P方式发布服务
[root@docker-01 ~]# docker images
[root@docker-01 ~]# docker run -d -p 80:80 nginx:1.20
[root@docker-01 ~]# docker ps -a 看到端口为80
[root@docker-01 ~]# docker run -d -P nginx:1.20
[root@docker-01 ~]# docker ps 看到端口为32768(随机的)
教学答案:
docker run -itd -p 80:80 --name nginx_v1 nginx:1.20
docker run -itd -P --name nginx_v2 nginx:1.20
- 查看容器日志和ip地址
查看所有的容器:[root@docker-01 ~]# docker ps -a
[root@docker-01 ~]# docker logs f0c7732c1a38
[root@docker-01 ~]# docker inspect f0c7732c1a38
教学答案:
docker logs nginx_v1
- 分别用宿主机和windows客户端访问网站
宿主机上使用命令curl访问:
[root@docker-01 ~]# curl http://192.168.10.11
[root@docker-01 ~]# curl http://192.168.10.11:32768
- 更换默认网站内容
[root@docker-01 ~]# vim index.html
添加:
保存退出
删除所有的容器:[root@docker-01 ~]# docker rm -f $(docker ps -aq)
重新创建容器并挂载自定义内容:
[root@docker-01 ~]# docker run -d -p 80:80 --name nginx-p -v $(pwd)/index.html:/usr/share/nginx/html/index.html nginx:1.20
教学答案:
在宿主机上编辑一个index.html文件,复制到容器中
docker cp index.html 容器ID:/usr/share/nginx/html/index.html
- 分别用宿主机和windows客户端访问网站
宿主机上访问:
[root@docker-01 ~]# curl http://192.168.10.11
Windows上访问:
实验三:
- 用centos:7作为基础镜像,安装nginx软件
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
容器里配置阿里源
[root@7e8b85e2402e yum.repos.d]# yum -y install nginx
- 利用容器创建新镜像centos_nginx:v1
[root@docker-01 ~]# docker commit 7e8b85e2402e centos_nginx:v1
[root@docker-01 ~]# docker images
- 使用centos_nginx:v1镜像生成新容器
[root@docker-01 ~]# docker run -it centos_nginx:v1 /bin/bash
[root@d5130c5979da /]#
- 进入容器查看nginx是否存在
[root@d5130c5979da /]# rpm -qa|grep nginx
实验四:
- 使用Dockerfile生成nginx:v1镜像
编写Dockerfile文件:
[root@docker-01 ~]# vim Dockerfile
添加:
FROM centos:7
MAINTAINER "shian@163.com"
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx
[root@docker-01 ~]# docker build -t nginx:v1 .
[root@docker-01 ~]# docker images
教学答案:
mkdir nginxdir
COPY index.html /usr/share/nginx/html/index.html
- 通过nginx:v1运行容器,分别使用-p和-P暴露端口
[root@docker-01 ~]# docker run -d -p 80:80 nginx:v1
[root@docker-01 ~]# docker run -d -P nginx:v1
- 分别用宿主机和windows客户端访问网站
宿主机上访问:
[root@docker-01 ~]# curl http://192.168.10.11
[root@docker-01 ~]# curl http://192.168.10.11:32770
Windows上访问:
实验五:手动安装nginx并暴露端口(扩展)
- 用centos:7运行一个容器,安装wget、nginx、net-tools
[root@docker-01 ~]# docker run -it centos:7 /bin/bash
配置阿里源
[root@ba80ce9864c2 yum.repos.d]# yum -y install nginx net-tools
- 运行/usr/sbin/nginx,查看80端口是否打开
[root@ba80ce9864c2 ~]# /usr/sbin/nginx
[root@ba80ce9864c2 ~]# netstat -anptl|grep 80
- Ctrl-p+q退出容器
- 复制index.html文件到容器/usr/share/nginx/html目录下
[root@docker-01 ~]# docker cp index.html ba80ce9864c2:/usr/share/nginx/html
- Docker inspect 容器,查看容器ip
[root@docker-01 ~]# docker inspect ba80ce9864c2
- Curl 容器IP,测试服务状态
[root@docker-01 ~]# curl 172.17.0.2
- 对外暴露端口:
iptables -t nat -A PREROUTING -d 192.168.10.11 -p tcp --dport 80 -j DNAT --to 172.17.0.2:80
iptables -t filter -A FORWARD -d 172.17.0.0/16 -j ACCEPT
- Windows客户端访问:http://192.168.10.11测试