docker
docekr 相当于超轻量级虚拟机,大部分代码应该属于隔离而非通信(因为docker最终都是调用的真实机器nix)
ubuntu/centos/nix 等os应该是docker提供的最小image了,其中也并非os的实现,而是docker的沙箱/壳实现
在沙箱中apt-get install 会体现到沙箱提供的文件系统(隔离code)等,所以主机看不到沙箱里面,沙箱也看不到外面
其他 image 应该是沙箱+应用的集合,从虚拟机观点看,每个应用都附着在其os沙箱上,多个应用合作必然会启动多个os,
但这个os反映到真实机器上就是我们的宿主机一个而已
1.ubuntu上安装docker
apt-get install docker.io
安装完毕, vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
或者
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://oyukeh0j.mirror.aliyuncs.com"]
}
EOF
sudo /etc/init.d/docker restart
2.搜索docker images
docker search ubuntu
docker search mysql
docker search centos
3.拉取 images 到本地
docker pull ubuntu
docker pull gcc
docker pull ubuntu
docker pull NAME[:TAG]
我们去网易云下载镜像也是ok的:
打开网易镜像中心(网易云–>镜像仓库–>镜像中心):https://c.163.com/hub#/m/home/
要下载mysql镜像,则搜索mysql镜像,第一条是官方的image,下载命令可以直接复制,到 linux中执行
docker pull hub.c.163.com/library/mysql:lates
4.操作本地 images
docker images 查看本地所有images
docker rmi
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
docker load -i fang.tar 从tar文件导入到本地docker image 也可以写作docker load < abc.tar。
docker export container-id > ./abc.tar 直接从container导出 tar 文件
docker import abc.tar name:tag 导入从container导出的tar文件得到新的image(名字为name:tag,也可不写)
5.基于本地某个image运行(container诞生)
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中的某个目录挂载到主机中
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,不需交互
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时将配置文件挂载在主机中
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
docker create -ti ubuntu:latest
新建一个处于停止状态的container
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登陆的功能啦
默认情况下,Docker的容器是没有特权的,例如不能在容器中再启动一个容器。这是因为默认情况下容器是不能访问任何其它设备的。但是通过"privileged",容器就拥有了访问任何其它设备的权限。当操作者执行docker run --privileged 时,Docker将拥有访问主机所有设备的权限,同时Docker也会在apparmor或者selinux做一些设置,使容器可以容易的访问那些运行在容器外部的设备.( https://www.cnblogs.com/asnjudy/p/4687272.html )
6.控制某个container
docker stop
docker start
docker restart container-id restart某个container
docker attach
docker rm -f
docker logs
7.控制container版本
docker ps -a 查看所有记录container运行记录
docker diff
docker ps -l 显示上次/最新的那笔container-id
docker rm
docker rm $(docker ps -a -q) 删除所有 container
docker commit
docker commit -m "一些说明信息" -a "作者"
生成定制化 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
https://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
https://segmentfault.com/a/1190000009237581