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 删除某个 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 : 将本地 image 导出到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 :/etc/nginx/ /root/nginx/etc/ 将container中的文件拷贝出来并整成和nginx一样。

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 stop某个contianer,若某个container正在与用户交互,则会自动exit,后台daemon container同样会exit
docker start 让一个container继续运行(作为一个daemon container)
docker restart container-id restart某个container
docker attach 转到后台daemon(即将其变成前台),对于已经stop的container, docker start 之后 docker attach 就相当于基于某个container-id 继续run
docker rm -f stop并rm 一个container
docker logs 获取daemon container 的输出

7.控制container版本

docker ps -a 查看所有记录container运行记录
docker diff 可以查看相对 docker run 时的image做了哪些改动。
docker ps -l 显示上次/最新的那笔container-id
docker rm 删除某个 container(可以同时删除多个 container-id 。后台运行的daemon可能需要 docker rm -f或者先 docker stop)
docker rm $(docker ps -a -q) 删除所有 container
docker commit : 提交某笔改动到本地image.默认tag是latest
docker commit -m "一些说明信息" -a "作者" ddddfang/ubuntu: 这里name写作 ddddfang/xxxx 的形式,因为我们定制的image若想通过 docker push : 推送到 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
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

posted @ 2025-08-29 13:39  ddddfang  阅读(6)  评论(0)    收藏  举报