Docker安装与实践

Docker安装:

Docker安装与实践_第1张图片

安装Docker可以使用两种方式:一种是离线安装,一种是在线安装方式。

在线安装Docker步骤:

  1. 卸载旧版:

    sudo yum remove docker-ce
    docker-ce-client
    docker-client-latest
    docker-common
    docker-latest
    docker-latest-logrotate
    docker-logrotate
    docker-engine
    
  2. 安装yum工具

    yum install -y yum-utils
    
  3. 设置yum仓库地址

    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
    sudo yum-config-manager
    --add-repo
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  4. 更新yum缓存

    yum makecache fast
    
  5. 安装新版docker

    yum install -y docker-ce docker-ce-cli container.io
    

Docker常用命令:(以hello-world为例)

  1. 启动docker

    systemctl start docker
    
  2. 设置docker开机启动

    systemctl enable docker
    
  3. 修改镜像地址:(由于国内网络问题,需要使用加速地址)

    修改配置文件/etc/docker/daemon.json,将这段代码直接在命令行中使用,cat命令会添加的

    cat < /etc/docker/daemon.json
    {
      "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com"
      ],
      "max-concurrent-downloads": 10,
      "log-driver": "json-file",
      "log-level": "warn",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
        },
      "data-root": "/var/lib/docker"
    }
    EOF
    
    
  4. 重新加载docker配置

    systemctl daemon-reload
    
  5. 重启docker服务

    systemctl restart docker
    
  6. 查看镜像配置

    docker info
    
  7. 下载需要的镜像:(下载需要的,比如说nginx,mysql,nacos等等,并且可以指定版本)

    docker pull hello-world
    
  8. 检查下载的docker镜像

    docker images
    
  9. 运行docker镜像

    docker run hello-world
    
  10. 检查已启动的docker服务(正在运行的)

    docker ps
    
  11. 查看所有镜像,包含没有运行的镜像

    docker ps -all   #all可以简写成a
    docker ps -a
    
  12. 停止docker容器

    docker stop 容器ID前几个字母就行
    
  13. 删除docker容器

    docker container rm 容器名或容器ID
    
  14. 删除所有终止状态容器

    docker container prune
    
  15. 删除docker镜像

    docker image rm hello-world
    
  16. 进入指定容器

    docker exec -it 容器ID bash
    
  17. 退出容器

    exit
    
  18. 查看容器日志信息

    docker container logs 容器ID
    
  19. 查看容器的信息(能够查看挂载目录信息)

    docker [volume/container] inspect 容器ID或数据卷ID
    

    ​ 信息可能不多,也可能很多一堆,其中有个Mounts的目录,这个目录就是挂载目录,Source:目录挂载时的本地目录,Destination:目录挂载时的容器目录。

  20. 挂载主机目录(常用):

    docker run -it -v /usr/app:/opt/app centos:7 bash
    

    挂载目录就是让双方这两个目录保持一致,一旦有一个目录里面的文件修改了,则另一个也会发生改变。

    /usr/app:这个目录是宿主机的目录

    /opt/app:容器的目录

    -v的意思是指定挂载目录,如果宿主机目录或容器目录不存在,docker会自动创建响应的目录。

注意:如果有容器正在使用镜像的话,当你删除镜像的时候,是会报错的,必须得先删除使用这个镜像容器,才能再删除镜像。

例子:Docker下载CentOS7镜像:

  1. 下载centos7镜像

    docker pull centos:7
    
  2. 查看下载镜像

    docker images
    

    或者

    docker image ls
    
  3. 运行centos7镜像

    docker run -idt centos:7 bash
    

    ​ 参数-it:i的意思是交互式操作,d是后台运行容器,t是终端,bash是打算进入bash执行一些命令并查看返回结果,因此我们需要交互式终端。bash放在镜像名后的是命令,这里我们希望有个交互式shell,因此用的是bash.

  4. 查看正在运行的容器

    docker ps
    

    查看所有容器(正在运行和没有运行的)

    docker ps -a
    
  5. 删除镜像:

    docker image rm 镜像ID或镜像名
    

创建数据卷:

  1. 创建数据卷container-vol

    docker volume create container-vol
    
  2. 查看所有数据卷

    docker volume ls
    
  3. 查看指定数据卷的信息

    docker volume inspect container-vol
    

    或者省略volume

    docker inspect container-vol
    
  4. 启动挂载数据卷的容器

    docker run -it --mount source=container-vol,target=/root centos:7 bash
    

    或者简写

    docker run -it -v container-vol:/root centos:7 bash
    
  5. 删除数据卷(如果数据卷正在被容器使用则无法删除)

    docker volume rm container-vol
    

    如果有容器正在使用数据卷,会提示错误,则需要先执行删除容器操作,再执行删除数据卷命令,才能删除数据卷

    docker container rm 容器ID
    

创建docker镜像(Dockerfile文件):

​ Dockerfile文件是一个用来构建镜像的文本文件,文本包含了一条条构建镜像所需的指定和说明,我们通常会基于此文件创建docker镜像。

​ 注意:文件名必须时Dockerfile,需要自己手动的创建,所以必须博正单词写的正确,大小写,空格都对!而且,在复制下面这个语句的时候,可能会发生单引号变成中文的问题哦,要注意点!

安装:,以jdk为例

​ 将压缩包放到Dockerfile同目录下将JDK的压缩文件放到同目录下

  1. 创建Dockerfile文件:
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \
    PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
CMD ['bash']

​ 2.使用Dockerfile构建镜像(必须在Dockerfile所在目录执行docker指令)

docker build -t jdk:8 . #不要丢掉这里的点,-t表示镜像标识(镜像名),是tar单词的缩写

​ 注意:末尾的点,表示构建过程中从当前目录寻找文件,jdk:8为我们创建的镜像名,执行完就能使用命令docker images在docker中看到jdk的镜像了!

​ 3.运行镜像:

docker run -it jdk:8 bash

这里的jdk:8是镜像名

​ 4.查看环境变量:

echo $PATH
导出镜像

当你身边的同事或者什么情况的,导致网络下不下来的时候,可以自己打一个包给他们!

  1. 从docker容器中导出镜像
docker save jdk:8 | gzip > jdk8.tar.gz

​ 2.导入docker容器

注意:要在jdk8.tar.gz

docker load < jdk:8.tar.gz

**打包:**以sentinel为例

  1. 将sentinel的jar包放到/root/servers/目录下

    docker run -d  -p 8180:8080 --name sentinel  \
    -v /root/servers:/usr/sca  \ 
    jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.0.jar
    
  2. 在浏览器中输入地址访问sentinel,没出问题的话,是能够访问的

    http://192.168.126.131:8180
    

    这说明jar包没问题,但是docker镜像库中没有sentinel这个镜像

  3. 找一个目录(/root/servers/),创建Dockerfile文件,用vim打开

    FROM centos:7
    ADD jdk-8u51-linux-x64.tar.gz  /usr/local/
    ADD sentinel-dashboard-1.8.0.jar  /usr/local/
    ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
        PATH=/usr/local/jdk1.8.0_51/bin:$PATH
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.0.jar"]
    
  4. 使用Dockfile构建镜像(一定要在Dockerfile文件所在的目录下执行)

    docker build -t sentinel:8 . #不要忘记这个点
    

    运行完这个命令,在docker的镜像库中就能看到sentinel的镜像了!

  5. 运行sentinel容器

    docker run -d -p 8180:8080 sentinel:8
    
  6. 查看日志(如果启动没启动就看看日志吧,看看什么原因)

    docker container logs 容器ID
    

案例:mysql

  1. 下载镜像:

    docker pull mysql:8.0.23
    
  2. 查看镜像

    docker images
    
  3. 启动MySQL镜像

    sudo docker run -p 3306:3306 --name mysql \
    -v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
    -v /usr/local/docker/mysql/conf:/etc/mysql \
    -v /usr/local/docker/mysql/logs:/var/log/mysql \
    -v /usr/local/docker/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:8.0.23
    
  4. 登录数据库

    进入mysql运行的那个容器

    docker exec -it mysql bash
    
    mysql -uroot -p
    root
    
  5. 停止mysql服务

    docker stop mysql运行容器的id
    
  6. 启动mysql服务

    docker start mysql运行容器的id
    
  7. 设置开机自启动

    docker update mysql --restart=always
    

安装redis

  1. 下载redis

    docker pull redis
    
  2. 创建redis的配置文件目录

    mkdir -p /usr/local/docker/redis01/conf
    touch /usr/local/docker/redis01/conf/redis.conf
    

    为什么创建这个目录,然后又创建了文件呢?

    ​ 因为我们接下来要执行的挂载命令中会出点问题,当我们不自己创建这个目录的时候,在挂载的时候,docker容器会自动认为这个redis.conf是一个文件夹而不是一个文件,这样的话,两边就创建了对应的redis.conf文件,但其实redis.conf是redis的配置文件。

  3. 启动容器并挂载对应的目录

    sudo docker run -p 6379:6379 --name redis01 \
    -v /usr/local/docker/redis01/data:/data \
    -v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \
    -d redis redis-server /etc/redis/redis.conf 
    
  4. 查看正在运行的redis容器

    docker ps
    

访问redis

  1. 进入正在运行的redis容器

    docker exec -it redis01 bash
    
  2. 检查redis版本

    redis-server -v
    
  3. 登录redis

    redis-cli -v
    
  4. 停止redis容器(其实就是停止redis服务)

    docker stop redis01
    
  5. 启动redis容器(其实就是启动redis服务)

    docker start redis01
    
  6. 重启redis容器(其实就是重启redis服务)

    docker restart redis01
    
  7. 查看redis服务日志

    docker container logs redis01
    

安装Nginx:

  1. 从远程镜像库拉取nginx镜像到本地docker镜像库

    docker pull nginx
    
  2. 查看下载的镜像

    docker images
    
  3. 创建数据卷来运行nginx服务(这个对象会在宿主机直接创建一个目录,使用docker inspect nginx-vol可以查看)

    docker volume create nginx-vol
    
  4. 查看数据库

    docker volume ls
    
  5. 查看nginx-vol数据卷的位置

    docker inspect nginx-vol
    

    默认位置是:

    /var/lib/docker/volumes/nginx-vol/_data
    
  6. 运行nginx服务的那个数据卷(其实就是运行nginx服务)

    docker run --name nginx -p 80:80 \
    -v nginx-vol:/etc/nginx \
    -d nginx
    

    其中,/etc/nginx是nginx容器启动时,nginx镜像文件默认的解压目录。

    以后要修改nginx的配置,可以直接去nginx-vol数据卷对应的目录去修改。

  7. 访问Nginx

    http://192.168.126.131/
    
  8. 停止Nginx服务

    docker stop nginx
    
  9. 启动Nginx服务

    docker start nginx
    
  10. 重启Nginx服务

    docker restart nginx
    

安装Nacos组件:

  1. 拉去Nacos(hub.docker.com)

    docker pull nacos/nacos-server:1.4.1
    
  2. 在mysql中执行nacos的sql脚本文件

    使用docker inspect mysql命令查看mysql的挂载目录

    我们通产是放在conf里面的,所以在Mounts中能够找到对应挂载目录,宿主机

    /usr/local/docker/mysql/conf 对应 容器的 /etc/mysql 目录

    {
    "Type": "bind",
    "Source": "/usr/local/docker/mysql/conf",
    "Destination": "/etc/mysql",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
    },
    

    将nacos-mysql.sql文件放到宿主机的/usr/local/docker/mysql/conf目录下

  3. 进入MySQL镜像容器中

    docker exec -it mysql bash
    

    登录Mysql

    mysql -uroot -p
    root
    

    查看对应的挂载目录是否有nacos-mysql.sql文件

    cd /etc/mysql
    ls
    

    如果挂载目录没有出错的话,肯定是在的

    执行sql脚本,没有这个数据库,nacos运行不了,里面有几个表包括User登录用户

    source /etc/mysql/nacos-mysql.sql
    
  4. 创建并启动nacos容器

    docker run  \
    -e TZ="Asia/Shanghai" \
    -e MODE=standalone \
    -e SPRING_DATASOURCE_PLATFORM=mysql \
    -e MYSQL_DATABASE_NUM=1 \
    -e MYSQL_SERVICE_HOST=192.168.126.131 \
    -e MYSQL_SERVICE_PORT=3306 \
    -e MYSQL_SERVICE_USER=root \
    -e MYSQL_SERVICE_PASSWORD=root \
    -e MYSQL_SERVICE_DB_NAME=nacos_config \
    -p 8848:8848 \
    --name nacos \
    --restart=always \
    -d nacos/nacos-server:1.4.1
    

    注意:不要忘记修改数据库的IP地址,修改数据库登录用户和密码(我们学习的时候一般都是root)

    参数说明

    单节点模式
    MODE=standalone
    数据库地址
    MYSQL_SERVICE_HOST
    数据库用户名
    MYSQL_SERVICE_USER
    数据库密码
    MYSQL_SERVICE_PASSWORD
    需连接的数据库名称
    MYSQL_SERVICE_DB_NAME
    端口映射
    -p 8848:8848
    设置任意时候重启容器,凯子就能自动启动容器(需要设置docker为开机自启)

    –restart=always

  5. 在浏览器中查看

    http://192.168.126.131:8848/nacos/
    

如果发生错误,使用docker container logs nacos查看日志

​ 6.停止nacos服务

docker stop nacos

​ 7.启动nacos服务

docker start nacos

​ 8.重启nacos服务

docker restart nacos

Docker容器互联

Docker中存在多个容器时,容器之间经常需要进行通讯,这又该怎么办呢?。

解决方案:

  • 第一种:两个容器之间通过宿主机进行通信(容器中的端口会映射到宿主机上)
  • 第二种:两个容器之间直接通过虚拟网络进行链接,但是需要在docker中创建网络
新建网络:
  1. 创建网络容器

    docker network create -d bridge t-net
    

    参数-d是driver网络类型的意思。

    t-net是我们自己给它起的网络名字

  2. 查看网络信息

    docker network ls
    

    可能会看到还有几个没见过的网络,它本身就创建有网络

  3. 查看网络信息

    docker inspect 网络ID
    
容器互联:
  1. 创建两个基于centos:7镜像的容器,并添加到t-net这个网络

    docker run -it --name app1 --network t-net centos:7
    
    docker run -it --name app2 --network t-net centos:7
    
  2. 在两个打开的窗口中互相ping一下

    ping app1
    
    ping app2
    

    Docker安装与实践_第2张图片

你可能感兴趣的:(数据库,docker,linux)