Docker介绍和基本使用

docker

1.为什么使用docker

docker使用的是container技术,比如部署rails过程中,最起码是需要服务器和数据库,其中服务器一般用nginx,数据库一般使用mysql,可以nginx使用一个独立容器,而mysql使用一个独立容器,这两个容器相互独立,又可以联通,容器本身是跨平台的,在部署的时候非常方便。

2.相关术语

镜像 image,是一个模板,容器是从镜像中生成的。

容器 container,应用运行在容器中。

仓库 repository:打包好的镜像是放置在仓库中的。

3.安装docker

1.需要提供镜像服务

需要提供镜像加速服务,这个在阿里云的[镜像加速器]这个服务模块中,用户有自己的加速链接(下面的registry-mirrors中的就是阿里云提供的)。这对mac的加速链接的方式是在docker客户端的Settings docker engine中进行修改。

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "registry-mirrors": [
    "https://xx"
  ]
}

示例:

#拉取镜像
docker pull nginx  #也可以是docker pull nginx:latest 最后这个是标签

#列出所有镜像 
docker images  #也可以是docker image ls

#启动容器
docker run -d --name web -p 8080:80 nginx:latest
#启动容器命令 docker run 
#-d 在后台运行
#--name web  定义容器名称为web
# -p 8080:80 定义端口,其中宿主机(就是本地的mac)端口为8080,容器端口为80
#nginx:latest 容器所需要的镜像名称

docker ps #查看启动的容器
docker ps -a #查看所有容器

#进入容器
docker exec -it web /bin/bash  #进入容器中,使用bash命令
apt update #更新源,如果没有更新源,那么vim安装不成功
apt install vim -y  #安装vim工具,更新/usr/share/nginx/html/index.html文件

#访问这个容器项目
访问链接http://localhost:8080/,修改主页内容/usr/share/nginx/html,修改html文件

#使用容器生成镜像
docker commit web hello-world  #web是目前容器的名称,hello-world是生成镜像的名称

#给镜像打tag,也可以理解是生成一份不同名字的拷贝
docker tag hello-world zhengjiajun/hello-world:latest
docker tag hello-world zhengjiajun/one

#将镜像提交到hub中需要将镜像的名称定义为user/name的形式,这也是上面tag的原因
#我的hub用户名称是zhengjiajun,所以将镜像命名为zhengjiajun/name的形式
#登录docker hub需要进行登录  登录和退出的命令分别是
docker login
docker logout

#docker上传到hub中
docker push zhengjiajun/one

使用docker-compose.yml文件

#启动 默认是docker-compose.yml文件,也可以使用自定义名称web.yml
docker-compose -f web.yml up -d

#文件结构,包括四个一级的key
version services  networks volumes

version ,对应关系https://www.cnblogs.com/fengfengyang/p/16442146.html

version: 3

services

#services的关键字
image #从官方或者自己的hub中获取镜像
build #从Dockerfile中构建镜像
ports #端口映射(容器内的端口映射到宿主机端口) “8080:80” 左边是宿主机的端口,右边的容器端口
volumes #卷挂载,“dbdata:/var/lib/mysql” 左边是要映射的目录,右边是容器目录
environment #设置环境变量,供容器内应用使用
  environment:
    MYSQL_ROOT_PASSWORD:admin
depends_on :依赖关系,确保服务的前后启动顺序 
command : 容器启动后执行的命令
networks : 网络设置
restart:always  随宿主机启动

networks

#常见驱动类型
bridge(默认模式) overlay host
#格式
drive:host

volumes

1.外部卷,docker外部创建和管理,可以被容器使用,示例是external:true
2.命名卷,有固定名称,在宿主机预定义的目录下面
volumes:
  dbdata:
3.匿名卷
4.主机卷,宿主机的文件系统挂载到容器中
/path/in/host:/path/in/container

完整的docker-compose.yml文件

version: '3.8'
services:
  db:
    container_name: sqldb
    image: mariadb
    volumes:
      - dbdata:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD: admin
      - MYSQL_DATABASE: jayzen_db
      - MYSQL_USER: my_user
      - MYSQL_PASSWORD: my_password
    networks:
      - mynet
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      -PMA_ARBITRARY: 1
    networks:
      - mynet
networks:
  mynet:
volumes:
  dbdata:

使用Dockerfile文件

#保存为文件Dockerfile
FROM ubuntu:latest
MAINTAINER jayzen <jayzen@foxmail.com>
RUN apt update #对镜像执行的命令
CMD ["echo", "hello world"] #镜像构建完成之后对容器执行的命令

#创建镜像, docker build创建镜像命令,-t name, 镜像名称, .当前文件夹下面
docker build -t myubuntu:1.0 .

#运行镜像,输出hello world表示成功运行 
docker run b8df944a8864 #b8df944a8864是镜像的id

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注