ddddfang's Blog.

docker-basic

字数统计: 1.8k阅读时长: 7 min
2019/01/11 Share

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

CATALOG
  1. 1. docker基础
    1. 1.0.1. 1.ubuntu上安装docker
    2. 1.0.2. 2.搜索docker images
    3. 1.0.3. 3.拉取 images 到本地
    4. 1.0.4. 4.操作本地 images
    5. 1.0.5. 5.基于本地某个image运行(container诞生)
    6. 1.0.6. 6.控制某个container
    7. 1.0.7. 7.控制container版本
      1. 1.0.7.1. reference