docker学习笔记-常用的命令

centos8 安装

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo

3、安装依赖包

yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm

4、安装docker(版本社区办docker-ce)

yum install docker-ce

查看容器的详细情况
docker inspect web
docker run --name v1 docker-edu/httpd:v1
制作本地镜像
docker commit -a "sdfsadfdasfa" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p web docker-edu/httpd:v0.2
docker run --name v2 docker-edu/httpd:v0.2
运行一个redis镜像 给起名为 redis-db  -d 放到后台运行,只打印运行ID
docker run --name redis-db -d redis:4-alpine
docker ps
通过外部命令进入redis 容器里面,好像新版本的不行这个版本可以
docker exec -it redis-db /bin/sh
docker run --name redis-db -d redis
停止运行的容器
docker stop redis-db
删除相应的容器
docker container rm redis-db
docker ps -a
docker logs redisdb  查看运行的日志
推送镜像到dockerhub 上,必须保证和线上一样的名称
修改tag 保持一样
docker tag docker-edu/httpd:v0.2 doudou007/docker-edu
docker login
docker push doudou007/docker-edu
docker tag docker-edu/httpd:v1 doudou007/docker-edu:v1
docker push doudou007/docker-edu:v1
镜像加速,用到阿里云的镜像仓库了,所以加阿里云的了,这个需要登录才能看到。
   vim /etc/docker/daemon.json
  {
    "registry-mirrors": ["https://2ukfyjyh.mirror.aliyuncs.com","https://registry.docker-cn.com"]
  }
修改完重启服务
service docker restart
推送镜像到阿里云的镜像仓库,这个需要直接登录创建仓库的密码
docker tag doudou007/docker-edu:v0.2 registry.cn-beijing.aliyuncs.com/jky/test:v1
docker login --username=3448xxx@qq.com registry.cn-beijing.aliyuncs.com
docker push registry.cn-beijing.aliyuncs.com/jky/test:v1
打包本地的镜像文件
docker save -o doudou007.gz  doudou007/docker-edu doudou007/docker-edu:v1
加载打包的镜像
docker load -i doudou007.gz
容器的网络类型
docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4b831dc43f52        bridge              bridge              local   大部分使用的类型
3bfd5b283e4e        host                host                local   所有容器可以共享物理机的网络名称空间  host
862dcefea2bc        none                null                local   可以设置无网络的容器
docker0 网桥,可以修改,自定义网桥和地址
自定义网桥
除了默认的 docker0 网桥,用户也可以自定义
在启动 Docker 服务的时候,使用 -b BRIDGE或--bridge=BRIDGE 来指定使用的网桥。
docker network create -d brideg --subnet "172.26.0.0/16" --geteway "172.26.0.1" mybr0
docker network ls
ifconfig (看到的生成的桥接网卡名称比较长,可以用ip命令修改成好看的)
docker run --name t1 -it --network mybr0 busybox
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
service docker stop
ip link set dev docker0 down
brctl delbr docker0
然后创建一个网桥 bridge0。
brctl addbr bridge0
ip addr add 192.168.5.1/24 dev bridge0
ip link set dev bridge0 up
查看确认网桥创建并启动。
ip addr show bridge0
bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
    link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.1/24 scope global bridge0
       valid_lft forever preferred_lft forever
配置 Docker 服务,默认桥接到创建的网桥上。
 echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
service docker start
启动 Docker 服务。 新建一个容器,可以看到它已经桥接到了 bridge0 上。
可以继续用 brctl show 命令查看桥接的信息。另外,在容器中可以使用 ip addr 和 ip route 命令来查看 IP 地址配置和路由信息。
/etc/docker/daemon.json
{
 "bip":"192.168.5.1/24",
 "fixed-cidr":"10.20.0.0/16",
 "mtu":1500,
 "default-geteway":"10.20.0.1",
 "dns":["10.20.1.2","10.20.1.3"]
}
核心选项为bip(bridge ip 之意,用于指定docker0 的IP地址;其他详细可以通过这个地址计算得出)
让docker可以让外部访问
docker守护进程的C/S,默认监听Uninx sockert 格式(/var/run/docker.sock)
如果要用TCP的方式
/etc/docker/daemon.json
{
  “hosts”:["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}
通过其他客户端访问
docker -H  10.211.55.11:2375 ps
也可以向dockerd 直接传递“-H|--host” 选项;

然后重启docker 就可以了
容器的独立资源
User  Mount  Pid UTS Net IPC
docker network inspect bridge
 
 
 

 用IP 命令来模拟网络类型

创建网络名称空间
ip netns help 
ip netns add r1 
ip netns list 
ip netns exec r1 ifconfig -a 
ip link help 
创建虚拟网络接口
ip link  add name veth1.1 type veth peer name veth1.2 
ip link show 
把创建的虚拟网卡给名称空间
ip link set dev veth1.2 netns r1 
ip netns exec r1 ip link set dev veth1.2 name eth0 
ip netns exec r1 ifconfig -a 
ifconfig veth1.1 10.1.0.1/24 up 
ip netns exec r1 ifconfig eth0 10.1.0.2/24 up 
ip netns exec r1 ifconfig -a 
ping 10.1.0.2 
ip link set dev veth1.1 netns r2 
ip netns exec r2 ifconfig -a 
ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up 
ip netns exec r2 ifconfig -a 
ip netns exec r2 ping 10.1.0.2 

 容器运行时指定网络类型
docker run --name t1 -it  --network none --rm busybox
docker run --name t1 -it --netwokr bridge -h docker --rm busybox  -h  指定容器的主机名
自动生成 /etc/hosts
可以通过相关参数注入响应的网络配置和主机名
docker run --name t1 -it --network bridge -h docker --dns 114.114.114.114 --dns-serarch ilinux.io --rm busybox
docker run --name t1 -it --add-host www.120ask.com:1.1.1.1 --rm busybox
-p 暴露容器端口到宿主机网络上(4中常用的映射方式)
docker run --name web --rm -p 80 nginx  动态获取一个端口 一般是3000 以后
docker run --name web --rm -p 10.211.55.11::80 nginx  指定ip 动态端口
docker run --name web --rm -p 10.211.55.11:8080:80 nginx  指定ip 动态端口
docker run --name web --rm -p 80:80   指定宿主机的端口和容器的端口
也可以指定暴露多个端口
-P 暴露所有的端口
自动在防火墙里面增加DNAT规则
docker port web
显示暴露的端口消息
联盟式容器 joined container
docker run --nmae b1 -it --rm busybox
docker run --name b2 --network container:b1 -it  --rm busybox
网络名称空间共享,其他不共享
测试
在 b2 里面
httpd -f -h /data/html
在 b1 里面访问
wget -o - -q 127.0.0.1
HOST 类型(共用宿主机的网络名称)
docker run --name b2 --network host  -it --rm busybox  
ifconfig 和宿主机一样的iP
开启httpd服务只要宿主机没有启动相应的端口可以通过宿主机网络访问httpd服务


volume 存储卷

docker 镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部添加一个读写层
如果运行中的容器修改了现在的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,就就是“写时复制(COW)” 的机制
默认是本地的存储卷
为什么用到存储卷
关闭并重启容器,其数据不受影响;但删除容器,修改的内容将全部丢失
存在的问题
1.存储于联合文件系统中,不易于宿主机访问;
2.容器之间的数据共享不便
3.删除容器其数据会丢失
解决方案 “卷(volume)”
卷是容器上的一个或多个“目录”,此类目录可以绕过联合文件系统,与宿主机上的某个目录“绑定(关联)”
volume 于容器初始化之时就会创建,由base image 提供的卷中的数据会于此时期间完成复制
volume 的初衷是独立于容器的生命周期实现数据持久化,因此删除容器的时候不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作;
卷为docker提供了独立于容器的数据管理机制
docker 挂载数据卷的默认权限是读写,可以通过:ro 指定只读
docker run -it --nmae v1 --rm -v /data:ro busybox
docker run -it --name v1 --rm -v /data busybox
docker inspect -f {{.Mounts}} v1
docker inspect -f {{.NetworkSettings.IPAddress}} v1 通过GO模板过滤数据
查看挂载的消息,默认是分配的,可以自己指定镜像挂载的路径
docker run -it --name v1 --rm -v /data/volumes/v1(宿主机的路径):/data(挂载到容器里面的路径) busybox
多个容器可以使用同一个宿主机目录
docker run -it -name v2 --rm -v /data/volumes/v1:/data busybox
然后在里面任意创建和修改文件,在另一个容器里面可以看到
复制使用其他容器的卷 --volume-from
docker run -it --name v2 --rm --volumes-from v1 busybox
通过容器卷做备份和恢复
备份
docker run -it --name v1 -v /data/volumes/v1:/data busybox
docker run --name db1 --rm --volumes-from v1 -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /data/
把数据还原到一个运行的容器上恢复
docker run --name db2 -it -v /dbdata ubuntu /bin/bash
docker run --name db3 --volumes-from db2 --rm -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /dbdata/

清理容器多余数据相关的命令有两条,分别是:
docker image prune -af 仅仅清除没有被容器使用的镜像文件
docker system prune -f 清除多余的数据,包括停止的容器、多余的镜像、未被使用的volume等等

http://www.dockerinfo.net/document 学习文档

 

 

 

 

 

 
posted @ 2019-02-27 11:21  屌丝的IT  阅读(294)  评论(0)    收藏  举报