容器技术docker入门

docker是什么

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

docker与虚拟机

docker与虚拟机
  • 最明显是Guest OS,docker没有虚拟化内核,使用宿主内核。
  • 虚拟机能做的,docker不一定能做,反之亦然。目前来说虚拟机可做的事情大于docker。
  • docker的特性在于轻量。如果在虚拟机中维护好几个内核,必然启动、运行速度都会很慢,但是很多场景,是不需要关注内核的,比如下载jenkins安装包,安装数据库等。这是docker轻量级、docker秒启动的原因。
  • 一台服务器可能只能挂几个虚拟机。一台服务器上可以启动上百个docker都没问题。
  • docker是怎么保证各个容器互相隔离?
    因为docker的核心技术:Namespace、联合文件系统、Cgroups帮助docker隔离不同级别的东西
    Namespace,网络名称空间,隔离网络机制,两个Namespace是网络完全隔离,无法通信的。除非通过端口映射出来。
    联合文件系统,给每个容器提供单独的视图,所以只能访问该容器中的文件,达到文件隔离。
    Cgroups,达到资源隔离,每个容器申请固定的资源。
  • 共用一个内核的缺点,如果一个容器把内核搞挂了,其他容器也挂了。但是一般不会搞挂,哈哈。

docker下载、安装

  • docker下载地址,选择mac/win版:https://www.docker.com/products/docker-desktop
  • 安装(mac)
    下载的.dmg文件,双击安装,拖动小图标到应用程序即可。

docker 镜像管理命令

  1. docker pull image_name [:tag]
    拉取镜像,不写tag默认最新版本latest
  2. docker push image_name
    推送镜像
  3. docker images
    查看当前机器所有镜像
  4. docker rmi image_name /image_id
    删除当前机器的一个镜像
  5. docker tag source_images_name:tag your_images_name:tag
    为一个镜像打上tag
    原本的镜像的源版本是不可修改的,只能给它打tag,增加新的版本
    docker tag jenkens:latest jenkens:5.5
    docker tag jenkens:latest myjenkens:5.5
    新增了一个版本,但是它的image_id都是一样的,说明不是新增一个镜像。
  6. docker save busybox>busybox.tar
    当前已有镜像保存: docker save jenkins>myjenkins.tar
  7. docker load < busybox.tar.gz
    本地下载好.tar包,加载镜像:docker load
  • 在哪里拉取镜像?
    世界上最大的镜像仓库,docker hub:https://hub.docker.com/
    国内镜像仓库:
    (1)中国科学技术大学:http://docker.mirrors.ustc.edu.cn
    (2)docker官方中国区: http://registry.docker-cn.com
    (3)网易:http://hub-mirror.c.163.com
    docker hub拉取镜像太慢了,添加国内镜像地址。

请使用http,不要用https,“No certs for egitstry.docker.com”。

  • 如何选择镜像呢?例:jenkins
    搜索栏进行搜索,第一个是官方提供的jenkins镜像:

    点击进去也会有更详细的说明文档:

    右侧也会有拉取镜像的命令:docker pull jenkins
    第一次拉取会比较慢,需要下载。

    安装完成:✅

docker 容器管理命令

  1. docker run jenkins
    通过一个镜像启动一个容器
    docker run -p 8080:8080 -p 50000:50000 jenkins
    端口映射,就是将宿主机的8080端口映射到容器的8080端口上。通过访问宿主机的8080端口,将请求转发到容器的8080端口
  • 是否可以后台运行?默认情况,网断或者shell交互关闭,容器都会挂掉。
    docker run -d jenkins
    后台运行了,查看docker启动日志
    docker logs -f
  • 让容器使用我自己命名的名字作为容器名称
    docker run -d --name myjenkins jenkins
  1. docker ps
    列出所有正在运行的容器
  • 列出所有容器docker ps -a
  • 新增一列SIZE,代表当前容器占用的容量docker ps -a -s
  1. docker stop CONTAINER_Name
    停止容器

  2. docker rm CONTAINER_Name
    删除容器

  • 先停止再删除,麻烦!
    强制删除容器 docker rm -f CONTAINER_Name
  1. docker kill CONTAINER_Name
    杀死容器,不会等待容器结束

  2. docker run -d --name myjenkins -p 8080:8080
    前面讲了,Namespace技术,使得各个容器间网络隔离,无法通信,宿主机也无法使用,除非使用端口映射。
    端口映射,就是将宿主机的8080端口映射到容器的8080端口上。通过访问宿主机的8080端口,将请求转发到容器的8080端口
    127.0.0.1:8080可以访问jenkins
    需要初始密码,启动log docker logs -f有初始密码

  3. 数据卷(Data Volume)
    存在容器中的数据会随着容器的删除、节点有问题而丢失。这是我们不愿意看到的。希望在容器中保存的数据能够持久化出来。用数据卷可以解决这个问题。
    -v 宿主机目录:容器目录命令,把宿主机上的某个目录挂载容器上 ,容器文件目录也映射到宿主机,即使容器删除,文件也还是保存在宿主机上的。
    ps:注意挂载权限 sudo chown -R 1000:1000 /home/docker/jenkins

  4. docker info
    查看docker服务的信息

  5. docker inspect CONTAINER_Name
    查看容器元数据

与容器交互的命令

  1. docker exec
    是在容器中去执行一条命令
  • docker exec -it jenkins bash 登录容器
    -it是启动虚拟的shell交互,shell交互去运行bash,才可以登录到容器里面
  • docker exec jenkins echo "hello world" 在容器jenkins中打印hello world
  • docker exec jenkins ping www.baidu.com在容器jenkins中ping百度
  1. ps aux|grep jenkins
    在容器中是看不到别的容器和宿主机的,但是docker留了一个口子,可以用宿主机看到容器。
  2. docker cp CONTAINER_Name:CONTAINER_PATH HOST_PATH
    把主机上的一个文件copy到容器中

拓展

联合文件系统:
x空间目录有A文件,Y空间目录有B文件,通过视图可以看到所有空间的所有文件,这个视图就是联合文件系统。这个视图里就要A、B文件。
在视图层中对A文件中加一行“hello”,同步到x空间中的A文件,在视图中对B文件中加一行“world”,在y空间并不会同步,而是在x空间记录“对B文件增加world这个字符串”,即记录对B文件的修改,原因是联合文件系统,只有链接的第一个目录有读写权限,其他目录只有读权限。
即无法修改的是镜像层,记录镜像层的修改是容器层,可以操作的是视图层。登录容器时,就是视图层。


把容器层叠加到镜像层,上层都是记录的对下层的修改。新的容器层继续记录对镜像层的修改。可以一直叠加。所以删除镜像时,是删除多层镜像,是一层一层删除的。

  • 为什么要使用多层镜像呢?提高复用性,节省空间。
    假设jenkin每层是这样,如果我想直接复用centos,上层装python、node.js,可以直接使用。



制作镜像

  1. 制作镜像的命令:docker commit myjenkins myjenkins:5.5
    制作新的命名为myjenkins的镜像,tag是5.5
  2. Dockerfile文件,docker官方推荐的制作镜像的方式

启动命令扩展

docker run -d --name myjenkins --net host jenkins
使用宿主机的网络启动jenkins

你可能感兴趣的:(容器技术docker入门)