- 镜像获取
# 先搜索⼀下,镜像⽂件,是否存在
docker search nginx
# 拉取,下载镜像
docker pull nginx
# 查看本地的docker镜像有哪些
- 查看镜像
docker image ls
# 运⾏镜像的命令,参数如下
## docker run 参数为
## 镜像的名字/id
## -d 后台运⾏容器
## -p 80:80 端⼝映射, 宿主机端⼝:容器内端⼝ ,你访问宿主机的这个端⼝,也就访问到了容器内的端⼝
## docker run命令,运⾏结果,会返回⼀个容器的id
root@C31M:~# docker run -d -p 80:80 nginx
1a033aef64fec78acc9007dc2d7c8e4ed9849ca00286676583777758a91fc84f
# 查看容器是否在运⾏
root@C31M:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac7d1e491bbb nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp cranky_mclaren
# 此时可以访问宿主机的80端⼝,查看到容器内的80端⼝的应⽤是什么了
192.168.x.x:80
# 可以尝试停⽌容器,看下结果
docker stop 容器id
# 停⽌具体的容器进程
docker stop ac7d1e491bbb
# 启动具体的容器进程
docker start ac7d1e491bbb
# 进⼊到正在运⾏的容器内,命令是 docker exec
# 运⾏容器,且进⼊容器内
# 参数 解释 -i 交互式命令操作 -t 开启⼀个终端 ac7d1e491bbb 是镜像的id bash 进⼊容器后,执⾏的命令
root@C31M:~# docker exec -it ac7d1e491bbb bash
# -it 开启⼀个交互式的终端 --rm 容器退出时删除该容器
root@C31M:~# docker exec -it --rm ac7d1e491bbb bash
# exit 退出镜像
exit
# 查看docker镜像的存储路径
docker info
#筛选一下路径
docker info |grep Root
# 该⽂件作⽤是 记录 镜像 和容器的配置关系
ls /var/lib/docker/image/overlay2/imagedb/content/sha256/ -l
- 镜像的增删改查
# 增加
docker pull xxx
# 查看
docker images xxx docker images nginx
docker images xxx:xxx docker images centos:7.8.2003
docker images -q # 值列出镜像的id -q --quiet 只列出id
#删除
# 根据镜像的 id,名字,摘要等
# 被删除的镜像,不得有依赖的容器记录
# docker rmi 镜像id
docker rmi hello-world
# 此时报错,提示hello-world 有依赖 通过docker ps -a 查看所有运行过以及正在运行的容器,所以使用docker rm xxx先删除容器记录
#查看容器列表并删除
docker ps -a
docker rm 容器id
#查看镜像列表并删除
docker images
docker rmi 镜像id
#批量删除镜像的操作
# 批量删除镜像,慎⽤,是删除所有镜像
docker rmi `docker images -aq`
- 镜像管理---镜像的导入与导出
# 导出镜像
# ⽐如默认运⾏的centos镜像,不提供vim功能,运⾏该容器后,在容器内安装vim
# 然后提交该镜像,再导出该镜像为压缩⽂件,可以发给其他⼈⽤
docker commit
# 导出镜像的命令
docker image save centos:7.8.2003 > /opt/centos7.8.2003.tgz
# 导⼊镜像的命令 load
docker image load -i /opt/centos7.8.2003.tg
# 查看镜像详细信息
# 查看docker服务的信息
docker info
# 查看dockers镜像信息,docker image inspect 镜像id
docker image inspect afb
- 容器的管理
docker run等于创建+启动
docker run 镜像名,如果镜像不存在本地,则会在线去下载该镜像
注意:容器内的进程必须处于前台运⾏状态,否则容器就会直接退出,⾃⼰部署⼀个容器运⾏,命令不得后台运⾏,前台运⾏即可
ping www.baidu.com 前台运行
nohub ping www.baidu.com 后台运行
jobs 查看后台运行的命令
fg id 例如fg 1让后台命令继续前台执行
如果容器内,什么事也没做,容器也会挂掉,容器内,必须有⼀个进程在前台运⾏
我们如果运⾏nginx基础镜像,没有运⾏任何程序,因此容器直接挂掉
# 运⾏容器的玩法
# 1.运⾏⼀个永远会挂掉的容器,(从错误示范来学docker容器,因为是后台运行了)
# 这个写法,会产多多独⽴的容器记录,且容器内没有程序在跑,因此挂了
docker run centos:7.8.2003
# 2.运⾏容器,且进⼊容器内,且在容器内执⾏某个命令
[root@yc_docker01 ~]# docker run -it centos:7.8.2003 sh
sh-4.2#
sh-4.2#
sh-4.2# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
# 3.开启⼀个容器,让它帮你运⾏某个程序,属于前台运⾏,会卡主⼀个终端
[root@yc_docker01 ~]# docker run centos:7.8.2003 ping baidu.com
PING baidu.com (198.18.0.130) 56(84) bytes of data.
# 4.运⾏⼀个活着的容器,docker ps可以看到的容器
# -d 参数,让容器在后台跑着(针对宿主机⽽⾔)
# 返回容器id
[root@yc_docker01 ~]# docker run -d centos:7.8.2003 ping baidu.com
608dd314f21c931c35c2a0ebf29b021c7634dfd26e4d757cf542f0eff6c64727
# 5.丰富docker运⾏的参数
# -d 后台运⾏
# --rm 容器挂掉后⾃动被删除
# --name 给容器起个名字
[root@yc_docker01 ~]# docker run -d --rm --name pythonav centos:7.8.2003 ping pythonav.cn
e3a7f6a7d0c6902d6af565b4bb9cf81a62d4840bbac978105b6d8da233f532a5
[root@yc_docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
e3a7f6a7d0c6 centos:7.8.2003 "ping pythonav.cn" 5 seconds ago Up 5 seconds pythonav
# 6.查看容器⽇志的玩法,刷新⽇志
docker logs -f
docker logs f2598cb26363 | tail -5
# 6. 查看容器内进程信息的命令
docker top 容器id
# 6. 查看容器内资源信息的命令
docker stats 容器id
# 7.进⼊正在运⾏的容器空间内
# exec指令⽤于进⼊容器空间内
docker exec -it f2598cb26363 bash
# 8.查看容器的详细信息,⽤于⾼级的调试
docker container inspect 容器id
# 获取容器内的ip地址,容器的格式化参数
docker inspect ed4e6852f620 | grep 172
# 拿到容器内ip
docker inspect --format '{{.NetworkSettings.IPAddress}}' ed4e6852f620
# 9.容器的端⼝映射
# 后台运⾏nginx容器,且起个名字,且端⼝映射宿主机的85端⼝,访问到容器内的80端⼝
docker run -d --name yuchao_nginx -p 85:80 nginx
# 查看容器
[root@yc_docker01 ~]# docker ps
# 9.1 查看容器的端⼝转发情况
docker port 容器id
[root@yc_docker01 ~]# docker port 2e73fac44507
80/tcp -> 0.0.0.0:85
80/tcp -> :::85
# 9.2随机端⼝映射 -P 随机访问⼀个宿主机的空闲端⼝,映射到容器内打开的端⼝
docker run -d --name
yuchao_nginx_random -P nginx
473ee9590e57d2880bd6a432a691dda055486d24878c27c79796300714e58977
[root@yc_docker01 ~]# docker ps
:::49153->80/tcp
0.0.0.0:49153->80/tcp,
# 10.容器的提交
# 运⾏基础的centos:7.8.2003 ,在容器内安装vim,然后提交新的镜像
# 新的镜像,再运⾏出的容器,默认就携带vim了
[root@yc_docker01 ~]# docker run -it centos:7.8.2003 bash
# 提交容器,通过docker images -a
#docker commit 容器id 新的镜像名
docker commit dafafe yuchao163/centos-vim7.8.2003
[root@yc_docker01 ~]# docker run -it yuchao163/centos-vim7.8.2003 bash
[root@f01fd5201723 /]# vim xiake.txt
[root@f01fd5201723 /]# cat xiake.txt
xin ku le peng you men ! xiake xiu xi !
# 修改镜像名字命令
[root@yc_docker01 learn_docker]# docker tag b4200a856253
my_nginx
dockerfile实践学习
dockerfile用来部署docker容器,就是用自定义的文件来部署一个所需的容器环境
定制docker容器的两种方式:
1、手动修改容器,导出这个容器的镜像,基于导出的镜像创建容器;
2、基于自定义dockerfile的指令文档,按照指令流程创建容器。
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别⼈,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让它⼲啥(在命令前⾯加上RUN即可)
ADD 添加宿主机的⽂件到容器内,还多了⼀个⾃动解压的功能
#ADD /opt/xx.tgz /opt/ 代表的意思是将宿主机的opt下的xxx.tgz文件解压后拷贝到容器内的opt目录下
# RUN tar -zxf /opt/xx.tgz # 报错!该tgz⽂件不存在!!
COPY 作⽤和ADD是⼀样的,都是拷⻉宿主机的⽂件到容器内,COPY就是仅仅拷⻉
WORKDIR 我是cd,今天刚化了妆(设置当前⼯作⽬录)
VOLUME 给它⼀个存放⾏李的地⽅(设置卷,挂载主机⽬录)就是把容器内的目录映射到宿主机上
EXPOSE 它要打开的⻔是啥(指定对外的端⼝),在容器内暴露⼀个窗⼝,端⼝ EXPORT 80
CMD 奔跑吧,兄弟!(指定容器启动后的要⼲的事情)
dockerfile实践
需求,通过dockerfile,构建nginx镜像,且运⾏容器后,⽣成的⻚⾯,是"带你学习docker"
# 1. 创建Dockerfile,注意⽂件名,必须是这个
[root@yc_docker01 learn_docker]# pwd
/learn_docker
[root@yc_docker01 learn_docker]# cat Dockerfile
FROM nginx
RUN echo '<meta charset=utf8>带你⽤docker运⾏nginx服务.' > /usr/share/nginx/html/index.html
# 2.构建Dockerfile
docker build .
# 3.修改镜像名字
[root@yc_docker01 learn_docker]# docker tag b4200a856253
my_nginx
# 构建出的镜像如下
如下指令该怎么⽤
[root@yc_docker01 learn_docker]# docker images
REPOSITORY TAG IMAGE ID
CREATED SIZE
my_nginx latest b4200a856253
About a minute ago 133MB
# 4.运⾏该镜像
docker run -d -p 80:80 my_nginx
# 5.查看宿主机的80端⼝
http://10.211.55.21/
带你⽤docker运⾏nginx服务
如下指令该怎么用
#COPY
copy chaoge.py /home/
# ⽀持多个⽂件,以及通配符形式复制,语法要满⾜Golang的filepath.Match
copy chaoge* /tmp/cc?.txt. /home/
#ADD
ADD chaoge.tgz /home/
RUN linux命令(xxx修改命令)
# CMD
# CMD在容器内运⾏某个命令,启动程序
# 该镜像在运⾏容器实例的时候,执⾏的具体参数是什么
CMD ["参数1","参数2"]
CMD ["/bin/bash"]
# 等同于命令⾏的直接操作 docker run -it centos cat /etc/osrelease
CMD ["cat","/etc/os-release"]
#docker run my_centos curl -s http://ipinfo.io/ip
CMD ["curl","-s","http://ipinfo.io/ip"]
# CMD有关启动程序的坑
#把宿主机安装,启动nginx的理念放⼊到dockerfile
1. RUN yum install nginx
2. RUN 配置⽂件修改 sed
3. RUN systemctl start nginx 容器内的程序必须是前台运⾏,你的容器是启动不了的
#这样第3步是无法启动容器的
4. 正确的应该是 CMD ["nginx","-g","daemon off;"]
#ENTRYPOINT
#ENTRYPOINT 和 CMD的用法
#作⽤和CMD⼀样,都是在指定容器启动程序以及参数。
#当指定了ENTRYPOINT之后,CMD指令的语义就有了变化⽽是吧CMD的内容当作参数传递给ENTRYPOINT指令。
CMD xxxx
ENTRYPOINT xx
#ARG和ENV
#ARG和ENV指令,都是用在dockerfile指令文件里
#相同点:ARG和ENV⼀样 设置一个变量,使用$NAME或${NAME} 就可以直接获取变量值,来引用。
#eg:定义变量
ARG NAME="yuchao"
ARG NAME "yuchao"
ENV AGE="18"
ENV AGE "18"
ENV MYSQL_VERSION=5.6
#不同点:ENV ⽆论是在镜像构建时,还是容器运⾏,该变量都可以使⽤。ARG只是⽤于构建镜像需要设置的变量,容器运⾏时就消失了。
#VOLUME
#容器在运⾏时,应该保证在存储层(容器内)不写⼊任何数据,运⾏在容器内产⽣的数据,推荐是挂载,写⼊到宿主机上,进⾏维护。
#VOLUME 宿主机目录:容器目录
#VOLUME 容器目录
#VOLUME /data # 将容器内的/data⽂件夹 ,在容器运⾏时,该⽬录⾃动挂载为匿名卷,任何向该⽬录中写⼊数据的操作,都不会被容器记录,保证的容器存储层⽆状态理。该匿名目录可以通过docker inspect 5b12bf9d63e9查看实体机映射到哪个匿名目录了
1.容器数据挂载的⽅式,通过dockerfile,指定VOLUME⽬录
2.通过docker run -v 参数,直接设置需要映射挂载的⽬录
# EXPOSE
#EXPOSE容器对外提供的端口服务
docker port 容器 #查看容器使用的端口情况
docker run -p 宿主机端⼝:容器端⼝
docker run -P # 大写P直接写容器端口,作⽤是随机宿主机端⼝:容器内端
#WORKDIR
⽤于在dockerfile中,⽬录的切换,更改⼯作⽬录
#USER
⽤于改变环境,⽤于切换⽤户
USER root
USER chaoge