我的docker笔记

镜像:类似虚拟机的镜像(可看作Java中的类)
容器:类似启动的虚拟机(可看作Java类的实例对象)
仓库:类似代码仓库,是docker存放镜像的地方
1.安装指南:https://docs.docker.com/engine/installation/linux/ubuntulinux/
           1.安装 linux-image-extra-* kernel packages
              $ sudo apt-get update
     $ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual


           2.安装docker-engine
              $ uname -r
              $ sudo apt-get update
     $ sudo apt-get install apt-transport-https ca-certificates
           $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
              创建docker.list文件
              $ sudo vi /etc/apt/sources.list.d/docker.list
              添加内容:
                deb https://apt.dockerproject.org/repo ubuntu-xenial main
              保存文件,并执行以下操作
              
                $ sudo apt-get update
$ sudo apt-get purge lxc-docker
$ apt-cache policy docker-engine
                $ sudo apt-get upgrade




2.启动Docker  ---  后台运行
         Docker只能root或名为docker的组内用户操作
            1.启动  sudo service docker start
            2.关闭  sudo service docker stop
            3.搜索并拉取公共镜像 image
                    docker search image_name
                    sudo docker pull image_name
            4.运行Docker程序
                    eg:
                       sudo docker pull hello-world
                       sudo docker run hello-world


3.拉取ubuntu镜像:
          1.从docker官方拉取
                    docker pull ubuntu:14.04
          2.从网易云docker仓库拉取
                    docker pull hub.c.163.com/library/ubuntu:latest
          3.为本地镜像添加新的标签  --  镜像复制后重命名
                    docker tag ubuntu:latest ubuntu:16.04
          4.docker inspect 镜像ID  获取镜像的详细信息
            返回的是一个json格式的字符串,如果只想获取其中指定的内容,可以通过-f指定参数:
            docker inpsect -f {{".Architecture"}} image_id或 image_name
          5.查找镜像
            docker search image
          6.删除镜像 (先删除容器才能删除镜像)
            docker rmi image_name或image_id
          7.创建镜像 3种方式
       1.基于已有镜像创建
       2.基于本地模板导入
       3.基于Dockerfile文件创建
1.基于已有镜像创建
                    docker commit [options] container [repository[:tag]]
                    options参数:
                                -a、--author="":作者信息
-m\--message="":提交消息
-p、--pause=true:提交时暂停容器运行
                    eg:
                      docker commit -m "message" -a "Jay" 容器ID 新容器TAG 新容器ID


                  2.基于本地模板导入
                      cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04  
          8.镜像导出
                  1.导出镜像为文件 docker save
                     docker save -o ubuntu.tar ubuntu:14.04
                  2.从文件导入镜像
                     docker load < ubuntu.tar
          9.上传镜像
                  docker push  默认上传到DockerHub官方
                      
 
4.自定义镜像
          1.创建镜像定义文件的目录 
                mkdir jay_ubuntu
          2.创建Dockerfile文件,并添加下面内容
                #设置继承自哪个镜像
FROM hub.c.163.com/library/ubuntu:latest
#创建者信息
MAINTAINER JayHe
#在终端需要执行的命令
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
          3.根据Dockerfile创建镜像
                docker build -t="jay/ubuntu:v1" .
            注意:
                命令中的最后一个点 不能省略,表示当期目录
          4.查看创建的镜像
                docker images
          5.删除已创建的镜像(必须停止该镜像的所有容器,要删除的镜像,不能有基于自己的子镜像)
                #按id删除
                docker rmi -f image_id
                #按name删除
                docker rmi -f image_name


5.运行容器
         创建容器:
               1.新建容器  创建好的容器处于停止状态,使用 docker start 启动容器
                     docker create -it ubuntu:latest
               2.启动容器
                     1.基于镜像新建容器并启动   docker run  <==> docker create + docker start
                       docker run ubuntu /bin/bash "Hello World"
                       #启动一个bash终端与用户交互
                       docker run -t -i ubuntu /bin/bash
                       参数解析:
                              -t  让docker分配一个伪终端并绑定到容器的标准输入上
                              -i  让容器的标准输入保持打开


                     2.启动处于停止状态的容器
                       docker start 容器id或name
               3.终止容器
                       docker stop 容器id或name
               4.查看容器
                       #查看所有容器
                       docker ps -a -q  
               5.进入容器
                     说明:
                         启动容器时, -d 参数会让容器在后台运行,无法直接看到容器中的内容
                   1.attach命令 进入容器
                         #后台一个启动容器
                         docker run -idt ubuntu:14.04
                         #进入容器
                         docker attach 容器name
                     注意:
                         当多个窗口(终端)同时attach到一个容器时,所有窗口都会同步显示,当某个窗口因为命令等阻塞后,其他窗口也会被阻塞而不能执行操作。
                  2.exec命令     docker1.3以上版本, 可以直接在容器中运行命令
                    eg:
                      #进入并启动一个bash         
                      docker exec -ti 容器ID  /bin/bash
               6.删除容器
                  docker rm [options] container [container...]
                      options选项:
                                -f、--force=false:因为运行中的容器默认是不能被删除的,这个参数就是强行终止并删除一个运行中的容器。
-l、--link=false:删除容器的连接,但保留容器。
-v、--volumes=false:删除容器挂在的数据卷。
                   eg:
                      #删除终止状态的容器
                      docker rm 容器ID
                      #删除运行中的容器
                      docker rm -f 容器ID
 
              7.导入导出容器
                   1.导出容器到文件
                      docker export 容器ID > 导出文件名.tar
                   2.从文件导入容器  对于刚刚导出的容器,对于使用docker import命令导入然后成为镜像
                         cat 文件名.tar | docker import - 镜像名:TAG
                      eg:
                         cat test.rar | docker import - test/ubuntu:v0.0.1
                    






         1.运行Hello World
                docker run ubuntu:14.04 echo "Hello World"
         2.在容器内运行一个ubuntu的shell (类似:开启并进入了一个ubuntu14.04的虚拟机)
                #-t选项是docker分配一个伪终端并绑定到容器的标准输入上,-i让容器的标准输入保持打开, 
                 -d让容器后台运行  
                docker run -t -i ubuntu:14.04 /bin/bash
         3.查看当前运行的容器
                docker ps [-l]
         4.docker run 参数:
                Docker run 运行一个容器
                <=> docker create + start 


ubuntu 镜像名字


-t 一个新容器内部的伪终端


-i 能与容器进行交互,交互模式


/bin/bash 在容器内启动Bash shell


-d 后台运行


docker ps 列出当前运行的容器
                docker ps -a -q 查看处于终止状态的容器


docker logs 显示某个容器的输出


docker stop 停止某个容器的运行


docker version 输出docker版本信息


         5.指定容器的端口映射     ---  启动容器  --- docker run 
                #直接启动一个容器     ---  非后台服务,-d 参数可设置为后台运行进程
                docker run -p 9090:22 -ti jayhe/ubuntu_tools:v1
                #以后台服务形式运行一个jayhe/ubuntu_tools:v1容器,并启动容器中的ssh服务
                docker run -d -p 9000:22 jayhe/ubuntu_tools:v1 /usr/sbin/sshd -D


         6.停止运行的容器   --- docker stop 容器id或容器name
                #查看运行的容器
                root@jayhe-ThinkPad-T450:~# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                    NAMES
3aa9fdb2dc23        jayhe/ubuntu:v1     "/usr/sbin/sshd -D"   2 minutes ago       Up 2 minutes        0.0.0.0:9001->22/tcp     lonely_easley
9fcbe96d1744        jayhe/ubuntu:v1     "/usr/sbin/sshd -D"   4 minutes ago       Up 4 minutes        0.0.0.0:9000->5000/tcp   tiny_mcnulty


                #指定停止运行的容器
                docker stop 3aa9fdb2dc23


                #停止所有的容器,这样才能删除其中的images
                docker stop $(docker ps -a -q)


                #删除指定容器  删除终止状态的容器,-f强行终止并删除一个运行中的容器
                docker rmi 容器id或容器name
                #删除所有容器
                方法1:先停止所有容器,再删除
       docker stop $(docker ps -a -q)
       docker rm $(docker ps -a -q)
                方法2:
                        docker rmi $(docker images q)


                删除untagged images,即:id为的image
                docker rmi $(docker images | grep "^" | awk "{print $3}")


                删除所有镜像:
                docker rmi $(docker images -q)




 
         
         7.docker容器操作的相关命令和参数
                -P 映射容器端口到主机端口


-l 告诉docker显示最后启动的容器信息


-a 显示所有容器的信息,包括已经停止运行的容器


PORTS 为容器端口与主机端口之间的映射


-p 80:5000 容器的5000端口映射主机的80端口


docker port 容器name/id 端口号,可以查看指定容器的端口5000映射到主机的端口


-f,类似Linux tail -f,查看容器的标准输出


docker top 用来查看容器内部运行的进程


docker inspect 查看容器的配置与状态信息,返回的是JSON串


docker inspect -f ,查询JSON串中的指定内容


docker rm 只能移除已经停止运行的容器,因此在用之前,需要用docker stop 停止运行你想要移除的容器 


         特别注意:
             1.关于Docker容器的端口映射
                  docker run -p 80:5000 xxx
                  docker run -p 9099:5000 xxx
                  主机的两个端口 80端口和9099端口,都映射到了容器的5000端口,
                  可通过localhost:80和localhost:9099访问不同的容器,
                  虽然两个容器的端口都是5000,但它们是不一样的,容器的namespace属性会将两个容器隔离开,因此它们对应的主机端口是不一样的
             2.ssh的端口是22
                  eg:
                     #启动Docker容器中的ssh服务,并进行端口映射到主机的8888端口
      root@jayhe-ThinkPad-T450:~# docker run -p 8888:22 jayhe/ubuntu_tools:latest /usr/sbin/sshd -D
                     
                     #主机,通过ssh连接docker启动的容器中的ssh   ---  类似:通过本机,连接到docker启动的ubuntu虚拟机
    root@jayhe-ThinkPad-T450:/home/jayhe/jay/docker/my_images/jay_ubuntu# ssh admin@localhost -p 8888
admin@localhost's password: admin
Could not chdir to home directory /home/admin: No such file or directory
To run a command as administrator (user "root"), use "sudo ".
See "man sudo_root" for details.


admin@0ab0e1aeb1a4:/$ sudo su
[sudo] password for admin: admin
root@0ab0e1aeb1a4:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@0ab0e1aeb1a4:/# 




          8.docker删除镜像image
                     1.移除exited状态的容器
                        $ docker rm $(docker ps -q -f status=exited)
                        整理成shell脚本:
                        #!/bin/sh
                        processes = 'docker ps -q -f status=exited'
                        if [ -n "$processes" ];then
                             docker rm $processes
                        fi
                     


                     2. 删除untagged images,即:id为的image
                        docker rmi -f $(docker images -a |grep 'none'|awk '{print $3}')
                        说明:
                            docker images -a |grep 'none'  过滤出所有 none的镜像
                            docker images -a |grep 'none'|awk '{print $3}'  输出过滤后的镜像内容的第三列(即:image id)
                             






6.Docker 基础网络配置    
      1.端口映射实现访问容器
           从外部访问容器应用        -P或-p参数,指定端口映射,映射到指定地址的指定端口
           docker run -d -p 127.0.0.1:5000:5000 traing/webapp python app.py 
           即:
              可以通过  127.0.0.1:5000访问容器的应用


      2.查看映射端口配置
           docker port 容器name 或 容器_id 5000
             
      3.容器互联实现容器间通信
           --name 为容器自定义命名
           docker run -d -p 8080:5000 --name web tranning/webapp java Test
           
           通过 docker inspect 查看容器名字
           docker inspect -f {{".RepoTags"}} 容器ID或容器名称
      
      4.容器互联
           #创建一个新的数据库容器
           docker run -d --name db training/mysql
           #删除之前创建的web容器
           docker rm -f web
           #创建新的web容器,并将它连接到db容器
           docker run -d -p --name web --link db:db traning/webapp python app.py
           解析:
               此时db容器和web容器建立了互联关系
               --link参数格式:
                   --link name:alias 
                   name:  要连接的容器名称
                   alias:这个连接的别名


                docker通过两种方式为容器公开连接信息
                   1.环境变量
                   2.更新 /etc/hosts文件
                eg:
                   #用env命令来查看web容器的环境变量
                   docker run --rm --name web2 --link db:db traning/webapp env




7.Docker 之 mysql
           1.拉取mysql镜像 
                   docker pull mysql:5.6
           2.运行mysql容器
                   #后台运行
                   docker run --name db001 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6
                   #前台运行
                   docker run --name db001 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -ti mysql:5.6


              解析:
                  容器名称:db001,mysql的root用户密码:root,
                  映射宿主机子的端口3306到容器端口3306,使用镜像 mysql:5.6
           3.查看运行的容器
                   root@jayhe-ThinkPad-T450:/home/jayhe/jay/docker/my_images/jay_jdk8_tomcat8# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
82b392d3abc6        mysql:5.6           "docker-entrypoint.sh"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp   db001
           4.删除容器
                   docker rm $(docker ps -a|grep db001)


           5.查看容器的端口映射关系
                   docker port 容器id或name


8.Docker之redis
           1.拉取redis镜像
                   docker pull redis
           2.启动容器
                   docker run --name redis-6379 -p 6379:6379 -ti redis:latest
               解析:
                   容器名称:redis-6379,端口映射 宿主机 6379 对应容器 6379 , -ti 前端交互方式运行容器 , -d 参数:可指定容器后台运行
           3.删除容器名称包含redis的容器
                   docker rm $(docker ps -a|grep redis)


           4.宿主机安装redis
                   下载redis最新办tar.gz,解压后,找到路径,运行 make 命令




9.Docker之MongoDB 
           1.拉取MongoDB镜像
             docker pull mongo:3.2.10
           2.启动容器
             #前台启动
             docker run --name mongo_server1 -p 21117:27017 mongo:3.2.10 
             #后台启动
             docker run --name mongo_server1 -d -p 21117:27017 mongo:3.2.10
           3.本地连接到容器的mongodb数据库
             root@jayhe-ThinkPad-T450:/home/jayhe/jay/soft/mongodb-linux-x86_64-3.2.6/bin# ./mongo  -port 21117
           4.Docker下创建MongoDB复制集群
             参考:http://blog.csdn.net/pddddd/article/details/46893593
            




10.Docker之Tomcat
           1.拉取Tomcat最新镜像
             docker pull tomcat
           2.启动Tomcat容器
             #前台启动,端口映射为 18080 到 容器 8080,如果想作为后台服务启动,加 -d 参数
             docker run -p 18080:8080 tomcat:latest
           3.宿主机访问
             http://localhost:18080


你可能感兴趣的:(docker)