Back
Featured image of post Docker

Docker

docker学习笔记

Docker Commands

启动docker服务

sudo service docker start

镜像

docker images
docker pull [image_name]

容器

docker ps		# 运行中的容器
docker ps -a 	# 所有容器,包括关掉的
exit() 			# 退出容器,会关闭
ctrl + p + q  	# 退出容器,不会关闭

docker pull [name]

docker start [id]	# 结合docker ps -a,重启一个容器
docker attach [id]	# 进入一个正在运行的容器
docker exec -it [id] /bin/bash  # 进入一个运行中的容器
docker

docker commit -m "" -a "author" [id] [name]:[TAG]  # 容器打包成一个镜像,他会出现在docker images里面


  • 容器持久化(数据卷)

    docker run -it -v 主机目录:容器目录 [image] /bin/bash
    
    example:
    docker run -it -v /home/ceshi:/home centos /bin/bash
    

命令混用:

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
# -d:后台运行
# -v:挂载
# -e:环境设置
  • 具体挂载和匿名挂载
# 匿名挂载
-v 容器内路径!就是没有写主机路径,然后他会自动生成很难看的名字
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume的情况
docker volume ls

# 具名挂载,相对于路径,路径是要有一个‘/’的,这里直接写名字了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

# 看具体目录
docker volume inspect juming-nginx

拓展:

ro: readonly
rw: read write # 默认
都是对于容器来说的,也就是说主机一定是最高权限

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

Dockerfile demo

FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"

CMD /bin/bash

多个mysql实现数据共享(使用 –volumes-from命令)

example:
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 意思就是开一个mysql02,并且在mysql01中找到“已经挂载到本地主机的卷”,不会把所有文件同步

Dockerfile

构建步骤:

  1. 编写一个Dockerfile 文件
  2. docker build 构建成一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)

Dockerfile构建过程

基础知识:

  1. 指令必须是大写字母
  2. 执行从上到下
  3. #表示注释
  4. 每一个指令都是一层

example:

image-20220124003316279
image-20220124003316279

常用指令

image-20220124004209145
image-20220124004209145

image-20220124003758969
image-20220124003758969

image-20220124110414254
image-20220124110414254

发布自己的镜像

DockerHub

docker login
docker tag [id] [username]/[image]:[tag]
docker push [username]/[image]:[TAG]

image-20220124104453083
image-20220124104453083

Docker网络

理解Docker0

ip addr

原理

  1. 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker就会有一个网卡docker0

    桥接模式,使用的技术是veth-pair技术!

    启动一个容器,就会有一个veth-pair

    # 我们会发现这个容器带来的网卡,都是一对对的
    # veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
    # 正因为有这个特性,veth-pair 充当一个桥梁连接各种虚拟网络设备
    

image-20220124131030034
image-20220124131030034

两个docker容器共用一个路由器,docker0 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip

小结

image-20220124131533162
image-20220124131533162

  • –link命令:建立容器名的访问

    单向,本来要ping一个ip的,现在可以ping一个名字,相当于在hosts里面加一个映射

自定义网络

查看所有的docker网络

docker network ls

网络模式

bridge:桥接docker(默认) none:不配置网络 host:和宿主机共享网络 container:容器网络连通!(用的少!局限很大)

测试

# 我们直接启动的命令 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat --net bridge tomcat

# docker0特点,默认,域名不能访问, --link可以打通连接!

服务器部署

注意:监听的地址不是localhost,要用ip addr看一眼!!!或者进hosts看

image-20220125184132253
image-20220125184132253

应该监听在docker中的地址,docker0(主机)可以访问到它,主机也可以通过主机的localhost来找到它(它能监听到)

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy