docker的入门之旅

538 阅读6分钟

序言

从docker的出现以来,它就成为了互联网公司的宠儿。换句话说现在牛逼的互联网公司的架构系统不使用在 Docker之上都不好意思说自己是一个纯粹的互联网公司。

本文章会带领大家了解 Docker 的基础概念,使用方式和一些使用docker的场景。


什么是docker?


或许很多同学都玩过例如这些大名鼎鼎的东西,如:Oracle VM VirtualBox,VMware Workstation。大家都会说这不就是虚拟机嘛,是的,这些都是业界大牛公司搞出来虚拟化技术。用过的同学都说,这docker和它们都没什么区别,感觉都是虚拟机。虽然在一定程度上它们的确很类似,但我们不能把docker当作是虚拟机,怎么说呢。因为从docker的出现到现在,docker肯定是比传统的虚拟机技术是更加强大的。首先,docker不与传统的虚拟机技术一样,它不是在你的宿主机上使用你的硬件进行虚拟出另外一个机子。但是docker是宿主机中的一个进程而已,它把它自身的网络 io都隔离成单独一个房间(如同一栋楼,楼为进程,里面的房间都是docker它自身的玩意进行隔离)。这样一来那么和虚拟化相比性能就高了不少,并且它能够开启的数量也足够的多。


安装


docker安装还是比较简单的,在不同的环境下有不同的脚本。但是我们具体的操作还是遵循官网的安装文档进行安装。

本文使用的macos进行安装,具体可以参考docker对应的官方文档。文档地址: 

docs.docker.com/docker-for-…

以macos为例子:

安装完成后进行对应的终端验证


三大核心概念



  • image:

       image俗称镜像,是docker可分层并且可复用的,类似于一个git仓库。


  • container:

    container俗称容器,是image镜像的载体,等同于楼中的房间。具有自己的进程,文件等等。


  • repository:

    repository俗称仓库,总体来说它比较相似于git仓库,它的作用就是将docker容器进行构建并且打包成一个镜像进行分发,其他的人可以使用该镜像进行自己环境。


docker命令


1. 查询对应的仓库是否有包


docker search 包名


例如我们需要安装nginx包,我们可以使用搜索命令查看使用量最多的包



2. 进行对应的镜像下载


docker pull 包名


例如我们需要安装hello-world包,我们可以使用搜索命令查看使用量最多的包,并且使用下载命令进行下载。



进行下载排名第一的包



3. 如何查看本地有哪些下载好的镜像


docker images



4. 删除一个不需要的镜像


docker rmi 镜像名字



5. 创建一个docker container,返回对应的container_id(也就是容器的标示)


docker create --name 容器名字 下载好的镜像名字


6. 启动一个docker container


docker start 对应的container_name



7. 查询运行中的容器


docker ps



8. 进入容器


docker exec -it 容器名字或则是container_id /bin/bash



9. run命令,run命令是create exec start的结合体


docker run --name 容器名字 镜像名字 /bin/bash



10. 停止一个container


docker stop container_id



11. 删除一个容器


docker container rm container_id



12. 强制干掉一个container


docker container kill 容器名字或则id


13. 查询一个容器的日志


docker container logs container_id



14. 构建一个镜像


docker commit --author "作者名字" --message "描叙信息" 启动的container_id 镜像名字


15. 推送到远程


docker login // 输入帐号密码后,没有需要注册一个docker push images中的名字docker logout // 登出



DockerFile



你可以选择使用基础镜像一步步的构建,也可以选择写一个配置文件,然后一条命令(docker build)完成构建,显然配置文件的方式可以更好地应对需求的变更,这个配置文件就是Dockerfile。


整个要求必须是使用开头 FROM 镜像名字 指定镜像是什么。

基本上指令很类似于linux的命令,具体我们编写的时候还是需要参考以下官网文档的。

https://docs.docker.com/engine/reference/builder/#environment-replacement


现在我们使用dockerfile去构建一个nginx,并且在根下面创建文件夹和文件并且写入hello world


FROM nginx​ 
RUN mkdir test_dir \&& cd test_dir \&& touch hello.txt \&& echo "hello world" > hello.txt




docker-compose.yaml 配置文件构建环境



相对dockerfile而言docker-compose等同于是写配置文件,并且我们需要对应某个镜像单独做一些如创建目录 下载扩展等等可以使用dockerfile进行辅助构建。基本上docker-compose的配置很多参数都是相当于命令中某些选项。相对而言,我还是比较喜欢用这种方式去搭建环境。


我们接下来会使用docker-compose来搭建php环境。


创建文件docker-compose.yml,代码如下:


version: '2'​
services:  nginx:    
    restart: always    
    container_name: my_nginx    
    # 镜像    
    image: nginx    
    # 将nginx链接到php-fpm    
    links:      
        - phpfpm    
    # 端口内部80映射80    
    ports:      
        - 80:80    
    networks:      
        - code-network    
    # 配置nginx配置映射和项目映射    
    volumes:      
        - ./index.html:/usr/share/nginx/html/test/index.html:rw      
        - ./index.php:/usr/share/nginx/html/test/index.php:rw      
        # 项目配置vhost      
        - ./nginx/conf/vhost/default.conf:/etc/nginx/conf.d/default.conf:rw    
        # command: nginx关闭守护进程    
    command: nginx -g "daemon off;"    
    tty: true​ 
 
    phpfpm:    
        container_name: my_php    
        # docker安装插件 https://docs.docker.com/samples/library/php/   
         build: ./php/    
         networks:      
            - code-network   
         volumes:      
            - ./index.html:/var/www/html/test/index.html:rw      
            - ./index.php:/var/www/html/test/index.php:rw    
         links:     
             - mysql    
             - composer​  

   mysql:    
    image: mysql:5.6    
    restart: always    
    ports:      
        - "3306:3306"    
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --init-connect='SET NAMES utf8mb4;'    
    # 环境变量 https://docs.docker.com/samples/library/mysql/    
    environment:      
        MYSQL_USER: root      
        MYSQL_ROOT_PASSWORD: ZeIH8QHbdAT6n6uNgaDwmmjG799IZFbh    
    networks:      
        - code-network​  

    composer:    
        image: composer​

    networks:  code-network:​


nginx.conf


server {   
     listen       80;    
     server_name  localhost;​    
     root   /usr/share/nginx/html;    
     index  index.html index.htm index.php;​    
     location / {​    }​    
     location ~ ^(.+\.php)(.*)$ {        
        root           /usr/share/nginx/html/test;        
        fastcgi_index  index.php;        
        fastcgi_pass   phpfpm:9000;    
        # 修改为phpfpm容器       
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/test$fastcgi_script_name;​        
        # 加入path_info环境变量        
        fastcgi_split_path_info  ^(.+\.php)(.*)$;        
        fastcgi_param PATH_INFO $fastcgi_path_info;        
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;​        
        if (!-e $document_root$fastcgi_script_name) {             
            # 此处直接返回404错误             
            return 404;        
        }​        
        include        fastcgi_params;    
    }
}


php插件dockerfile


FROM php:7.3-fpm​ 
RUN php -m​ 
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install opcache​
# redis
RUN pecl install -o -f redis \&&  rm -rf /tmp/pear \&&  docker-php-ext-enable redis​


如何启动,在对应的文件下面 ,-d表示后台运行


docker-compose up -d


如何退出


docker-compose stop


如何重启


docker-compose restart


更多命令可以使用--help进行查看


查看效果:





总结



相对来说,docker的使用对软件的开发,或者部署等等之类的都带来了极大的便利,虽然说只是一个入门的探究。

以上的示例代码是作为一个学习参考,请不要直接使用到任何项目环境中,以上说明纯属个人的理解。如果你需要深入学习docker,我的建议还是需要从官方的详细文档进来览阅。

如果您对这些感兴趣,欢迎评论,收藏、转发给予支持!> 欢迎关注我的公众号:猿力说,每日分享学习之路的点点滴滴,以及程序人生.