Docker的那些事
> #如果你有某个需求点
> 请 Ctrl+F 进行查找
- dockerr官网
- 安装
- 点击快捷方式
- 重启电脑
- 查看是否安装成功
- cmd 运行 docker version
在Centos上安装 docker
-
进入centos系统命令
-
参考地址
-
安装
-
sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2 -
sudo yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo -
sudo yum install docker-ce
-
-
启动
- 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"]
- FROM scratch
-
执行该文件
- 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
- docker MySQL 参考地址
创建一个没有密码的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)- (uname−s)−(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