Docker 学习笔记

十年热恋 提交于 2019-12-06 02:05:56
## 前台运行docker pull lazydockerdocker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /opt/docker:/.config/jesseduffield/lazydocker lazyteam/lazydocker
  • 官方文档 : 分为以下几大块内容

  • 获取Docker

  • 开始使用Docker

  • 使用Docker进行开发

  • 配置网络

  • 管理应用程序数据

  • 在生产中运行你的app

  • Docker标准和合规性compliance

  • Docker中的开源代码

  • 文档归档(历史版本)

Docker的基本组成

Docker客户端/守护进程:C/S架构 本地/远程

Docker Image 镜像 : 容器的基石,层叠的只读文件系统 bootfs -> rootfs(ubuntu) -> add app , 联合加载

Docker Container 容器 : 通过镜像启动,启动和执行阶段,写时复制

Docker Registry仓库 : 共有,私有,Docker Hub

Docker实际上是运行在Linux之上的技术,在windows和OS X中需要运行在docker定制的虚拟机上。

容器的基本操作

  • 启动容器 docker run IMAGE command arg docker run ubuntu echo "hello world"

  • 启动交互式容器 docker run -i -t ubuntu /bin/bash

    • -i –interactive=true\false

    • -t –tty=true/false

  • 查看容器 docker ps [-a][-l][-q]

  • docker inspect containerid/name 查看容器配置

  • 自定义容器名字 docker run –name container新名字 -i -t ubuntu /bin/bash

  • 重新启动和停止容器 docker start/stop -i containerName

    • 停止所有容器 docker stop $(docker ps -a -q)
  • 删除停止的容器或所有容器 docker rm container / $(docker ps -a -q)

批量删除容器,再删除镜像

# 停止所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop

# 删除所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm

# 删除所有none镜像
docker images|grep none|awk '{print $3 }'|xargs docker rmi

先查询依赖

docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=XXX)    # XXX指镜像ID
然后根据根据TAG删除容器

docker rm REPOSITORY:TAG

守护形式运行容器演示

  • 运行容器 docker run -i -t ubuntu /bin/bash

  • 退出容器内部/实际上在后台运行 ctrl +p 或 ctrl + q

  • 重新进入容器 docker attach 容器id

  • 真正退出容器 exit

  • 守护式容器启动一般方法演示 docker run –name dc1 -d ubuntu /bin/sh -c “while true;do echo hello world ;sleep 1;done”

查看容器日志

docker logs -tf –tail 10 dc1

查看容器中的进程

docker top containerName

在运行中容器内部启动新进程

docker exec [-d][-i][-t] 容器名 [command][args]

停止守护式容器

docker stop 容器名

docker kill 容器名

镜像操作

docker images [-a –all] [-f filter] [–no-trunc imageid不截断][-q –quiet 只显示id]

- repository,tag,image id,created,大小
- <none>中间层镜像

查看镜像详细信息:docker inspect imageid/仓库+tag
删除镜像 docker rmi imageid/仓库+tag
删除所有镜像 docker rmi $(docker images -q ubuntu)

查找镜像

- Docker Hub
- docker search  imagesName [--automated=false][--no-trunc][-s --stars 最低star数]

拉取镜像

- docker pull  仓库+tag [不指定则下载lastest]

国内docker镜像服务器加速镜像下载
使用 –registry-mirror选项,修改完毕后重启docker守护进程 service docker restart

- /etc/default/docker 添加 DOCKER_OPTS = "--registry-mirror=http://www.daocloud.io"

推送镜像

- docker push imageName:tag

构建镜像

  • 通过容器构建 :docker commit [-a –author][-m –message] [-p –pause=true] 容器名
    • 把应用打成新的镜像 docker commit -a "fubinh" -m "nginx web server test" nginx_web_test fubinh/nginx_web_test
    • 用新镜像启动容器:docker run -d --name nginx_web -p 80 fubinh/nginx_web_test nginx -g "daemon off;"
  • 通过Dockerfile构建镜像 : docker build –force-rm= false –no-cache=false –pull=false [-q,–quiet=false],–rm=true,[-t,–tag=”ImageName”]
    FROM centosMAINTAINER fubinh "fubincloud@gmail.com"RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmRUN yum install -y nginxEXPOSE 80

开始根据Dockerfile文件构建 :docker build -t='fubinh/nginx_web_test2' . 注意这里有一个点,代表Dockerfile文件在当前文件夹

Docker的C/S模式 - Remote API

连接方式

  • unix:///var/run/docker.sock

  • tcp://host:port

  • fd://socketfd

客户端和服务端可以部署在不同的机器上,可以通过以上三种方式调用服务端接口

Docker守护进程配置

启动选项

运行相关:[-D --debug][-e --exec-driver="native"][-g --graph="/var/lib/docker"]

服务器连接相关 [-G ,-H]...

存储相关 [-S ]...

Registry相关

网络设置相关

docker启动配置文件 :linux[/etc/defaults/docker]

Docker的远程访问

Docker客户端和服务端部署在两台机器上

-H 选项

DOCKER_HOST环境变量简化远程访问配置

Dockerfile 指令

  • FROM 基础镜像

  • MAINTAINER 维护者

  • RUN 运行指令 ,镜像构建过程中执行

  • EXPOSE 暴露端口

  • CMD 容器运行时执行的指令(会覆盖我们在命令行docker run指定的命令)

  • exec模式 CMD[ “executable”,”param1”,”param2”]

  • shell 模式 CMD command param1 param2

  • CMD[“param1”,”param2”] 作为ENTRYPOINT指令默认参数, 启动容器时后面带的命令会把cmd命令覆盖

  • ENTRYPOINT :和cmd唯一区别是不会覆盖docker run的指定命令,只有最后一条生效,启动容器后面的命令覆盖不了entrypoint带的命令,可以在docker run 后面带–entrypoint参数覆盖

  • ADD [src dest] 文件和目录复制到使用Dockerfile构建的镜像中,包含了tar解压功能,可以带远程链接地址

  • COPY 单纯复制,推荐使用COPY而不是ADD

  • VOLUME[“/data”] 可以存在于一个或者多个容器的特定目录,这个目录可以绕过联合文件系统,提供共享数据和数据持久化的功能

  • WORKDIR /path/to/workdir 从镜像创建一个新容器时,在容器内部设置工作目录,cmd和entrypoint指定的命令都会在这个目录下执行,通常使用绝对路径,如果使用相对路径,会传递下去。

  • ENV key=value 环境变量,构建和运行过程中有效

  • USER daemon 以什么用户来运行,默认root用户

  • USER user / uid / user:group / uid:gid / user:gid / uid:group

  • ONBUILD 镜像触发器 ,当一个镜像被其他镜像作为基础镜像时执行,在构建过程中插入指令 ,比如复制宿主机上的页面替代nginx默认页面,当构建新的镜像时,这个替换才会生效。

镜像的构建过程

- 使用缓存和不使用缓存(--no-cache)
- 中间层镜像调试
- 查看构建过程 docker history images

Docker 网络

基础

  • docker0 网桥 属于 ISO七层模型中的数据链路层

  • 修改docker0的ip :ifconfig docker0 192.168.21.110 netmask 255.255.255.0

  • 自定义虚拟网桥

容器互联

  • 允许所有容器互联 默认 –icc=true

  • –link container:别名 启动时docker会自动修改容器的ip地址和hosts文件的映射

  • 拒绝容器间的连接 –icc=false (全部拒绝)

  • 允许特定的容器间的连接 –icc=false –iptables=true(控制网络访问的组件,配置了–link的可以访问)

iptables -L -n

容器与外部网络连接

–ip_forward=true : 是否允许转发流量

iptables :与Linux内核集成的包过滤防火墙系统 表table。链filter(input,forward,output),规则rule

允许端口映射访问

限制IP访问容器

学习iptables的设置

容器的数据管理

数据卷

变化的数据需要持久化,数据需要在容器间共享。可以绕过联合文件系统UFS

添加数据卷:docker run -v ~/container_data:/data -it ubuntu /bin/bash

为数据卷添加只读权限:docker run -v ~/container_data【本地宿主机目录】:/data【容器内目录】:ro -it ubuntu /bin/bash

Dockerfile创建数据卷: VOLUME[“/data/d1”.”/data/d2”],本地的映射目录由docker自动创建,使用docker inspect containerid 查看,相同dockerfile创建的不同容器数据卷是不同的

数据卷容器

实现数据的共享:命名的容器挂在数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。

  • docker run --volumes-from 挂载了数据卷的容器名
    如果数据卷容器删除了,不影响其他容器数据的使用,容器数据卷挂载可以传递。

    如果一个数据卷还在被容器使用,那么他就会一直存在。

数据卷的备份和还原

备份方法:新建一个用于数据备份的容器

docker run –volumes-from 容器名 -v /backup[本地目录]:/backup[容器目录] –name containerName[备份容器名] ubuntu[镜像] tar cvf /backup/dvt5.tar[压缩后的名字] /datavolume1[需要备份的目录]

还原和备份的思路一致,把压缩命令替换成解压缩命令

容器的跨主机连接

  • 使用网桥实现跨主机容器连接

安装网桥管理工具 bridge-utils

优点:配置简单,不依赖第三方软件

缺点:与主机在同网段,需要小心划分IP地址,需要有网段控制权,在生产环境中不易实现,不容易管理,兼容性不佳

  • 使用 Open vSwitch实现跨主机容器连接

多层虚拟交换机,C语言开发,让大规模的网络自动化可以通过编程扩展,同时支持标准的管理接口和协议(NetFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag)

GRE:通用路由协议的封装

Open vSwitch基于网桥实现,位于网桥上层。

  • 使用weave实现跨主机连接

建立一个虚拟的网路,用于将运行在不同主机的Docker容器连接起来 https://www.weave.works/

搭建私有仓库

  1. 下载docker registry服务
    docker pull registry
  2. 启动,端口5000
    docker run -d -p 5000:5000 –name registry registry
  3. 前端界面
    sudo docker run \  -d \  -e ENV_DOCKER_REGISTRY_HOST=localhost \  -e ENV_DOCKER_REGISTRY_PORT=8080 \  -p 8080:80 \  konradkleine/docker-registry-frontend:v2

参考 :手把手教你搭建Docker Registry私服

使用Dockerfile构建Centos7镜像/php镜像/wordpress

本实验在OSX Parallels Desktop Centos7中验证,环境准备遇到的问题:
1.不能root用户登录,参考 , sudo su
2.yum安装出现/var/run/yum.pid已被占用,删除该文件即可,参考
3.安装git 参考 
4.克隆资源 https://gitee.com/dockerf/docker-training
https://csphere.cn/
5.Centos Docker安装

Docker体积小的原因 :不包含父镜像的大小

  • Centos
  • php-fm
  • mysql
  • wordpress

操作步骤

查看命令使用方式 docker help build

## 构建基础镜像## docker build -t registry_url/namespace/fubin/centos:7.1  ./pathdocker build -t csphere/centos:7.1 .## 运行  端口 -P容器重启后宿主机端口会发生变化和 -p端口不变docker run -d -p 2222:22 --name base  csphere/centos:7.1 ## 构建中间镜像 php-fmdocker build -t csphere/php-fpm:5.4 .## docker run -d -p 8080:80  --name website  csphere/php-fpm:5.4## 检查php环境http://127.0.0.1:8080/info.php## 进入交互式模式 attach会挂掉docker exec -it  website  /bin/bash## supervisor 工具查看进程状态supervisorctl## 构建中间镜像mysql,如果这个镜像想包含php的功能,FROM则可以使用php-fm镜像docker build -t csphere/mysql:5.5 .## start脚本 set -e 第一条脚本执行出错,则不会继续执行下面的命令## 启动mysql5.5docker run -d -p 3307:3306 --name dbserver scphere/mysql:5.5##进入容器docker exec -it dbserver /bin/bash## 挂载volmuedocker run -d -p 3307:3306 -v ~/Documents/Projects/docker/docker-training/mysql/data:/var/lib/mysql --name dbserver csphere/mysql:5.5## 构建服务wordpress.dockerignore  忽略某文件## 使用php-fm当作父镜像,ONBUILD指令起作用,把php文件拷贝到/app目录中docker build -t csphere/wordpress:4.2 ./wordpress## 启动 wordpressdocker run -d -p 80:80 --name wordpress -e WORDPRESS_DB_HOST=127.0.0.1 -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=csphere2015 csphere/wordpress:4.2

 

在Docker中部署静态网站

  • 设置容器的端口映射

    • 大写[-P] –publish-all=true docker run -P -i -t ubuntu /bin/bash

      • 小写[-p] –publish=[]
  • 指定容器端口 docker run -p 80 -i -t ubuntu /bin/bash

  • 指定主机端口和容器端口 docker run -p 8080:80 -i -t ubuntu /bin/bash

  • 指定ip和容器端口 docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash

  • 指定ip宿主机端口,容器端口docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

  • 拉取centos容器 docker search centos ,docker pull centos

  • 启动容器并把端口映射为9999:docker run -i -t -d -p 9999:80 --name web centos /bin/bash

  • 安装必要软件,如wget,curl yum install -y wget

  • 安装nginx : yum方法安装无法安装成功,需要安装nginx源 yum install -y nginx

  • rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

  • yum源的资源路径在/etc/yum/repos.d/nginx.repo

  • 外网访问http://localhost:9999,容器内访问http:://localhost:80

  • 其他容器访问,通过docker inspect查看容器的ip ,端口任然使用80

附录

以下是Nginx的默认路径:

(1) Nginx配置路径:/etc/nginx/
(2) PID目录:/var/run/nginx.pid
(3) 错误日志:/var/log/nginx/error.log
(4) 访问日志:/var/log/nginx/access.log
(5) 默认站点目录:/usr/share/nginx/html

以下是Nginx常用命令

  • 启动:nginx
  • 测试配置是否正确 nginx -t
  • 优雅重启 nginx -s reload
  • 查看nginx进程 ps -ef | grep nginx
  • 停止 nginx -s stop 或 kill -9 pid
 

Docker操作数据库

## 创建数据库create database solo default charset utf8mb4 collate utf8mb4_general_ci;#启动docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Lzslov123! -d mysqldocker run -p 3306:3306 --name solodb -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql#进入容器docker exec -it mysql bash#登录mysqlmysql -u root -pALTER USER 'root'@'localhost' IDENTIFIED BY 'Lzslov123!';#添加远程登录用户CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY 'Lzslov123!';GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%';

文件上传下载工具 :xshell 下的rz sz
https://blog.51cto.com/oldboy/588592

Docker下的数据库备份

https://blog.csdn.net/MR1269427885/article/details/82978311

docker exec -i solodb bash <<'EOF'    mkdir ~/$(date +%Y%m%d)    ## 备份指定数据库  mysqldump --databases solo  -u用户名 -p密码 > /root/$(date +%Y%m%d)/solodb_$(date +%Y%m%d_%H%M%S).sql  ##mysqldump -u用户名 -p密码 > ~/$(date +%Y%m%d)/solodb_$(date +%Y%m%d_%H%M%S).sql    # 备份所有数据库  ## mysqldump --no-defaults --events --all-databases -uroot -padmin > /backup/mysql/$(date +%Y%m%d)/all_$(date +%Y%m%d_%H%M%S).sql    exit    EOF    docker  cp -a  solodb:/root/$(date +%Y%m%d)   /root/info/data/

crontab定时任务

## 定时任务crontab -e# 每天下午一点执行脚本 0 13 * * * bash /backup/mysql.sh##重启crondservice crond restart

 

服务器复制文件到本地

#!/bin/bashfilename=`date -v -0d +%Y-%m-%d`## 远程拷贝scp -r root@IP:服务器路径  ./${filename}## 压缩zip -r ${filename}.zip ${filename}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!