docker基础
- docekr 相当于超轻量级虚拟机,大部分代码应该属于隔离而非通信(因为docker最终都是调用的真是机器*nix)
- ubuntu/centos/*nix 等os应该是docker提供的最小image了,其中也并非os的实现,而是docker的
沙箱
/壳
实现
- 在沙箱中apt-get install 会体现到沙箱提供的文件系统(隔离code)等,所以主机看不到沙箱里面,沙箱也看不到外面
- 其他 image 应该是沙箱+应用的集合,从虚拟机观点看,每个应用都附着在其os沙箱上,多个应用合作必然会启动多个os,
但这个os反映到真实机器上就是我们的宿主机一个而已
1.ubuntu上安装docker
1
| apt-get install docker.io
|
安装完毕, vim /etc/docker/daemon.json
1 2 3
| { "registry-mirrors": ["http://hub-mirror.c.163.com"] }
|
2.搜索docker images
1 2 3
| docker search ubuntu docker search mysql docker search centos
|
3.拉取 images 到本地
1 2 3 4
| docker pull ubuntu docker pull gcc docker pull ubuntu docker pull NAME[:TAG]
|
我们去网易云下载镜像也是ok的:
打开网易镜像中心(网易云–>镜像仓库–>镜像中心):https://c.163.com/hub#/m/home/ (17621308623@163.com + fang716617)
要下载mysql镜像,则搜索mysql镜像,第一条是官方的image,下载命令可以直接复制,到 linux中执行
docker pull hub.c.163.com/library/mysql:lates
4.操作本地 images
docker images
查看本地所有images
docker rmi <image-name>
删除某个 image(默认tag是latest),image-name也可以是image id,注意当container还在使用某个image的时候,image是删除不掉的,必须先删除container再删除image
docker rmi $(docker ps -a -q)
删除所有 image
docker tag ubuntu:latest newimage:mynewtag
镜像重命名(会拷贝出来一个新的,image-id和原来的一样。可以通过image名删除原来的)
docker inspect ubuntu:ver01
查看镜像的详细信息(inspect同样可以用在container上)
docker save -o fang.tar <name>:<tag>
将本地 image 导出到tar文件,也可以写作 docker export container-id > ./abc.tar
docker load -i fang.tar
从tar文件导入到本地docker image 也可以写作docker load < abc.tar
5.基于本地某个image运行(container诞生)
1
| docker run --name os -t -i -v /:/mnt:rw ubuntu /bin/bash
|
命令 |
说明 |
docker run |
运行一个container |
–name os |
名字即为 os,若不指定,docker会为container自动指定一个 |
-t -i |
分配一个 tty 且我们可以 interact with it,可以简写为 -ti |
-v /:/mnt:rw |
将主机下的/冒号左边的目录以rw方式挂载到容器中的/mnt下 还可以将主机下的某个文件映射到container中,eg -v ~/.bash_history:/.bash_history |
ubuntu |
使用ubuntu基础镜像,默认tag为latest |
/bin/bash |
进入容器后 运行/bin/bash |
- exit 退出容器,contianer状态变为stop
- -v 挂载看起来是将主机的某个目录挂载到container, 而container还有个volume的概念,是将container中的某个目录挂载到主机中
1
| docker run -v /root:/root -d ubuntu-fang:0.2 /bin/bash -c /root/abc.sh
|
命令 |
说明 |
-d |
后台运行一个container |
/bin/bash -c /root/abc.sh |
进入容器后运行 /bin/bash -c /root/abc.sh ,不需交互 |
1
| docker run --name first-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
|
命令 |
说明 |
–name first-mysql |
给新建的container命名为 first-mysql |
-p 3307:3306 |
将container中的3306端口映射到主机的3307端口 |
-e MYSQL_ROOT_PASSWORD=123456 |
配置信息,配置mysql的root密码 |
-d |
将container放在后台运行 |
- -d mysql 后mysql就直接运行了,而若再加上/bin/bash则只运行一次mysql并进入交互模式,此后只能手动启动mysql服务,其他一些镜像比如 nginx 也是如此,这些是在镜像被构建的时候CMD参数指定的
- 然后主机安装mysql客户端就可以访问了docker中的mysql了,
apt-get install mysql-client-core-5.7
, 然后使用 mysql -hxxx.xxx.xxx.xxx -P3307 -uroot -p123456
登陆.其中xxx.xxx.xxx.xxx是本机ip,并且本机所有ip的3307端口都被映射到container的3306。
- 修改mysql配置需要修改container中的/etc/mysql/my.cnf文件,再重新启动container,或者直接docker run时将配置文件挂载在主机中
1 2 3 4 5 6 7 8
| docker run \ -p 8080:80 \ --name nginx_web \ -v /root/nginx-docker/log/:/var/log/nginx \ -v /root/nginx-docker/etc/nginx.conf:/etc/nginx/nginx.conf \ -v /root/nginx-docker/html/:/usr/share/nginx/html \ -d \ nginx
|
- 启动 nginx,并挂载了三个主机目录到container(这三个目录下分别存放了 nginx的log文件夹,nginx的etc配置文件,nginx的html资源文件夹)
- 挂载前可以先使用
docker cp <container-id>:/etc/nginx/ /root/nginx/etc/
将container中的文件拷贝出来并整成和nginx一样。
1
| docker create -ti ubuntu:latest
|
新建一个处于停止状态的container
1
| docker exec -ti container-id /bin/bash
|
后台登陆一个运行的container,与docker run的区别就在此命令不会新建container,所以 docker run == docker create + docker start + docker exec
新开启一个终端后,会自动退出container,但我想多个terminal协作?
1.若是基于congtianer-id 进行 docker attach,则是和前一个congtainer属于同一个会话,我们的操作会同步显示在两个terminal上
2.若是基于images 再 docker run 一个contianer就是另一个用户了,但此时就没法和第一个终端协作了(因为此时与前一个terminal处于两个隔离的container中)
docker exec -ti container-id /bin/bash 使用docker exec 登陆一个运行的container即可完成类似ssh登陆的功能啦
6.控制某个container
docker stop <container-id>
stop某个contianer,若某个container正在与用户交互,则会自动exit,后台daemon container同样会exit
docker start <container-id>
让一个container继续运行(作为一个daemon container)
docker restart container-id
restart某个container
docker attach <container-id>
转到后台daemon(即将其变成前台),对于已经stop的container, docker start <container-id>
之后 docker attach <container-id>
就相当于基于某个container-id 继续run
docker rm -f <container-id>
stop并rm 一个container
docker logs <container-id>
获取daemon container 的输出
7.控制container版本
docker ps -a
查看所有记录container运行记录
docker diff <container-id>
可以查看相对 docker run 时的image做了哪些改动。
docker ps -l
显示上次/最新的那笔container-id
docker rm <container-id>
删除某个 container(可以同时删除多个 container-id 。后台运行的daemon可能需要 docker rm -f
或者先 docker stop
)
docker rm $(docker ps -a -q)
删除所有 container
docker commit <container-id> <name>:<tag>
提交某笔改动到本地image.默认tag是latest
docker commit -m "一些说明信息" -a "作者" <container-id> ddddfang/ubuntu:<tag>
这里name写作 ddddfang/xxxx 的形式,因为我们定制的image若想通过 docker push <name>:<tag>
推送到 hub.docker.com 就必须使用这种格式,ddddfang必须和用户名匹配
生成定制化 image的两种方式
1.docker run ==> 修改 ==> docker commit
2.编写 Dockerfile(类似makefile了) ==> docker build -t=”:“ . (最后的 . 表示在当前目录下寻找 Dockerfile,从github去找Dockfile则可以是 docker build -t "abc:v01" git@github.com:ddddfang/docker-file-exer
)
reference
https://docs.docker.com/install/#pre-releases
https://github.com/DieterReuter/workshop-raspberrypi-64bit-os/blob/master/part1-bootloader.md
http://www.runoob.com/docker/ubuntu-docker-install.html
https://blog.csdn.net/xiaochendefendoushi/article/details/80979905
https://zhuanlan.zhihu.com/p/26418829
https://www.zhihu.com/topic/19950993/top-answers
docker搭建个人博客
https://segmentfault.com/a/1190000009237581