Docker的那些事

Docker的那些事

> #如果你有某个需求点 
> 请 Ctrl+F 进行查找
  • dockerr官网
  • 安装
  • 点击快捷方式
  • 重启电脑
  • 查看是否安装成功
    • cmd 运行 docker version

在Centos上安装 docker

  • 进入centos系统命令

  • 参考地址

  • 安装

  • 启动

    • sudo systemctl start docker
  • 重启docker

    • sudo service docker restart
  • 查看是否安装成功

    • sudo docker version
  • 验证

    • sudo docker run hello-world
  • 完成第一步

  • 查看docker环境里image

    • sudo docker image ls
  • 如何创建一个 image

    • sudo docker pull ubuntu:14.04
  • 如何通过第三方 创建image

###自己如何搭建 base image

  • 创建官方 hello-world image

    • docker pull hello-world
  • 执行 hello-world

    • docker run hello-world

使用c语言搭建第一个 iamge

  • 创建文件夹

    • mkdir hello-world
  • 进入该文件夹

    • cd hello-world
  • 创建一个后缀为.c的文件

    • vim hello.c (写入代码)
  • 安装 gcc和glibc-static包来编辑c文件

    • sudo yum install gcc

    • sudo yum install glibc-static

  • 通过gcc和 -static去编译hello.c 变成可执行的hello文件

    • gcc -static hello.c -o hello
  • 执行编译后的文件

    • ./hello
  • 在当前文件夹里创建一个名为Dockerfile的文件

    • FROM scratch
      ADD hello /
      CMD ["/hello"]
  • 执行该文件

    • docker build -t home/hello-world .

###什么是Container

  • 通过image创建(copy)
  • 在image layer之上建立一个container layer (可读写)
  • 类比面向对象:类的实例
  • image负责APP的缓存和分发,container负责;运行APP

docker 命令

  • 查看当前正在运行的容器

    • docker container ls
  • 查看当前运行并退出的所有容器

    • docker container ls -a

    • docker ps -a

  • 删除一个 运行并退出的容器

    • docker container rm ID(ID的一部分)

    • docker rm ID

  • 查看所有容器的ID

    • docker container ls -qa
  • 删除所有的容器

    • docker rm $(docker container ls -qa)
  • 删除一个镜像

    • docker image rm ID
    • docker rmi ID
  • 如何将容器container转换成镜像image

    • docker commit dazzling_keller home/centos-vim
  • 如何将image镜像转换成容器container

    • docker run -it Name (镜像)

通过docker file去创建镜像(推荐)

  • 创建目录

    • mkdir Name

    • cd Name

    • vim Dockerfile

      FROM centos RUN yum install -y vim

    • docker build -t home/centos-vim-new .

      通过当前安装 上面写好的文件内容 镜像为home/contos-vim-new

    注意:如果你是通过docker file生成的镜像,那么在分享的时候就可以只分享我们的docker file ,别人就可以build成跟你一样的docker file

Dockerfile语法梳理及最佳实践

  • FROM

    尽量使用官方的image作为base image

  • LABEL

    作者 描述等等
    Metadata 不可少 一定要有一下镜像的基础信息

  • RUN

    为了美观尽量把多行代码合并成一行

    • 通过 && 符号链接

    • 通过 \ 换行

  • WORKDIR

    创建目录

    尽量使用 WORKDIR 不要使用RUN cd

    尽量使用绝对路径

  • ADD and COPY

    • 将当前可执行文件添加到根目录

    ADD 不光可以添加文件而且还可以解压缩

    大部分情况下,COPY是优先于ADD的。ADD除了COPY还有其他的功能(解压缩),添加远程文件/目录请使用curl或者wget

  • ENV

    • 设置常量

    MYSQL 5.6

    • (RUN)引用常量

    “${MYSQL}”

尽量使用ENV增加可维护性

  • VOLUME and EXPOSE

    • 存储 和 网络

3.7 RUN vs CMD vs ENTRYPOINT

  • RUN

    执行命令并创建新的image layer

  • CMD

    设置容器启动后默认执行的命令和参数

    如果docker run 指定了其他命令,cmd命令会被忽略

  • ENTRYPOINT

    设置容器启动时运行的命令

    让容器以应用或者服务的形式运行

    不会被忽略,一定执行

3.8镜像的发布

前提:你必输hub.docker的账号。

镜像的名字最好是,“用户名/镜像名”

> 假如你的hub账号的用户名是Aaron,上传镜像的名字是hell,那么你在本地镜像的名字应该为   Aaron/hell.
  • 终端登录

    docker login

  • 上传镜像

    docker push Aaron/hell:latest

注意:我们上面push的文件是不安全的,最安全的方式是push dockerfile文件

  • 搭建属于自己的dockerhub

    registry 镜像

3.9-10容器的操作及实战

  • more app.py

    查看文件内容

  • 后台运行

    docker run -d id/name

    docker run -d --name=deme id/name

  • 如何进入正在运行的程序

    docker exec -it ID /bin/bash

  • 查看后台进程

    ps -ef | grep python

  • 打开指定程序运行的ip

    docker exec -it ID ip a

  • 停止正在运行的容器

    docker stop ID

    docker stop demo

name and ID 是一样的,一个唯一的名字

  • 启动 容器

    docker start demo

  • 展开容器的详细信息

    docker inspect ID

  • 查看容器运行的信息

    docker logs ID

3.11 实战2 stress

  • 安装stress

    stress 压力测试

    • apt-get update && apt-get install -y stress
  • 查看 stress在哪里

    which stress

  • stress 帮助

    stress --help

  • 进程

    –vm #进程

    –vm-bytes #为每个进程分配多大内存 默认是256M内存

    –verbose #查看分配dbug

  • 查看共有内存

    top

  • 如何通过stress去打包创建一个image

    • 创建Dockerfile文件

    vim Dockerfile

FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD []

3.12 如何对一个容器进行资源限制

  • 储存为200 线程为1

    docker run --memory=200M id/name --vm 1 --verbose

如果碰到 启动了进程但是有些进程错误,可以再开个 终端,查看正在运行的进程-docker ps,停止错误进程-docker stop。

  • 内存为500 线程为1

    docker run --memory=200M id/name --vm 1 --verbose --vm-bytes 500M

  • cpu 全占

    docker run --cpu-shares=10 --name-name1 id/name --cpu 1

    docker run --cpu-shares=5 --name-name2 id/name --cpu 1

上面所叙述的是:name1、2共占CPU1的100%,而name1占的是name2的2倍

4.1本章概述和试验环境介绍

  • Docker Netwoork

    • 单机

    Bridge Network

    Host Network

    None Network

    • 多机

    Overlay Network

5.1Docker 的持久化存储和数据共享

  • Docker 持久化数据的方案

    基于本地文件系统对的Volume。可以在执行Docker create或 Docker run 时,通过 -v 参数将主句的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。

    基于plugin的Volume,支持第三方的存储方案,比如NAS,aws

  • Volume的类型

    受管理的data Volume ,由docker后台自动创建。

    绑定挂载的 Volume,具体挂载位置可以由用户指定

  • 数据持久化:Data Volume

    创建一个没有密码的volume

    sudo docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

    • 查看 volume 列表

    sudo docker volume ls

    • 查看 volume 里的详细信息

    sudo docker volume inspect VOLUME

    • 停止 volume

    sudo docker stop mysql1 mysql2

    • 移除 MySQL容器 1 、 2

    sudo docker rm mysql1 mysql2

    及时你停止和移除了容器,但是volume还在

    • 删除 volume

    sudo docker volume rm VOLUMENAME

    • volume 未定义的名字太长了,如何自定义名字

    sudo docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql

    注:跟第一步相比 增加了 -v mysql:/var/lib/mysql 意思就是 只要是在此目录安装的MySQL ,就遵循 --name 的名字

    • 如何进入自己定义 MySQL容器 里

    sudo docker exec -it mysql1 /bin/bash

    • 进入MySQL容器里后如何进入 MySQL shell里呢

    mysql -u root

    • 如何进入MySQL容器的databases里

    show databases

    • 新建database

    create database aaron

    • 如何不用停止MySQL容器 直接强制删除

    sudo docker rm -f mysql1

    注意:上面只是删除了MySQL 但是volume还在。当你在重新创建一个mysql容器时,这个容器同样会使用上次的volume。

5.4 数据持久化2:Bind Mouting

  • 1 and 2的区别

    第一中必须去创建一个Date volume 并指明存放的路径

    而第二种,只要指明数据存放的路径就行,但是这个路径是本地和虚拟环境保持同步一致,一个发生个改变另一个也发生改变。

  • 如何去操作正常的流程呢

    • 第一步 在项目里 进入 labs/docker-nginx/

    cd labs/docker-nginx/

    • 第二步 build 一个image名字为 aaronfuxinhan/my-nginx

    • 第三步 创建容器

    docker run -d -p 80:80 --name web aaronfuxinhan/my-nginx

    curl 127.0.0.1

    • 第三步 在本地输入服务器的地址就可以看到 页面显示对的文字了。
  • 如何去操作同步的流程呢

    • 第三步 创建容器指定文件目录(按照Dockerfile里的)

    docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web aaronfuxinhan/my-nginx

    注意:现在 你在里面操作任何东西,容器里的和本地 都会进行同步

    • 验证是否能同步

    • 进入容器文件

    docker exec -it web /bin/bash

    • 新建文件

    touch text.txt

    查看文件 ls

    退出容器 exit

    查看文件 ls

    如果一样同步成功

5.5 开发者利器 bind mount

  • 进入5章的 flask-skeleton build flask-skeleton 成image

6-1 部署一个wordpress

  • pull wordpress 镜像image

    docker pull wordpress

  • 创建一个完整的 MySQL

    • 创建MySQL容器

    docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress

    -d 后台运行
    -v volume:本地地址映射容器地址
    -e 后面参数 具有选择性
    -p 端口映射

    • 创建一个WordPress的容器

    docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress

    • 检查

    docker ps #可以看到两个容器在运行一个WordPress一个MySQL

    • 浏览器端输入ip和端口

    出现 wordpress安装页面,代表成功了

6.2 docker Compose

  • 什么是docker compose

    Docker compose 是一个工具
    这个工具可以通过一个yml文件定义对个容器的docker应用
    通过一条命令既可以根据yml文件的定义去停止和删除多个容器

  • 如何去编写这个yml文件

    yml文件默认的文件名是:docker-compose.yml

  • yml 文件的三大概念

    • Services

    一个service代表一个container,container可以通过hubdocker直接pull,也可以通过Dockerfile build出来image。
    Service 的启动类似docker run ,我们可以给其指定nerwork和volume,所以可以给service 指定 nitwork 和Volume 的引用

    • Networks
    • Volumes
  • 安装docker-compose

    sudo curl -L “https://github.com/docker/compose/releases/download/1.22.0/docker-compose- ( u n a m e − s ) − (uname -s)- (unames)(uname -m)” -o /usr/local/bin/docker-compose

    sudo chmod +x /usr/local/bin/docker-compose

    docker-compose --version

  • 如何启动yml 文件

    docker-compose -f 文件名 up

  • docker-compose 命令

    docker-compose ps

    docker-compose stop

    docker-compose start

    docker-compose down # 启动和移除

    docker-compose --help

  • docker-compose up --scale web=3 -d

    后台增加或减少web服务 为3个,

如何用docker快速搭建一个项目

(前提是必须安装好docker环境)
  • 创建Dockerfile文件

    vim Dockerfile

  • build Dockerfile文件成image

    docker build -t aaron/doncker .

  • 运行 image文件

    docker run aaron/docker

补充

  • 如何查看notebook5的历史日志

    sudo docker logs -f notebook5

  • 查看固定几条

    sudo docker logs --tail 5 notebook5

  • 将本地文件映射到docker上 (服务器后天不会自动运行Ctrl+c暂停)

    sudo docker run -d -p 8889:8888 --name notebook5 -v /home/ubuntu:/opt/app/data mikebirdgeneau/jupyterlab

  • 服务器后天运行 本地路径:docker原路径

    sudo docker run -d -P --name notebook5 -v /home/ubuntu:/opt/app/data jupyter/all-spark-notebook

    docker port notebook5 8888

配置远程访问jupyter

  • 生成密码

    ipython 或者 python

    都可以,能进去python就可以

  • 在python命令行里分别输入:

    from notebook.auth import passwd

    passwd()

    成功:一次输入Enter和verify password

    得到:‘sha1:2c863f45bd3d:13338f98af695a0f82c8b5499e3adb7c978e9d20’

    存好:等下用 退出python

  • 生成jupyter notebook的配置文件

    jupyter notebook --generate-config

  • 修改配置文件

    vim ~/.jupyter/jupyter_notebook_config.py

    安装 vim :

    apt-get install vim

  • 加入如下内容,其中sha1那一串秘钥是上面生成的那一串

    c.NotebookApp.ip=’*’

    c.NotebookApp.password = u’sha1:41e4da01dde4:e820dc9c0398eda2dc9323c9e4a51ea1228166a2’

    c.NotebookApp.open_browser = False

    c.NotebookApp.port =8888

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值