Docker安装与运行自定义镜像-CentOS

卸载老版本的docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

和docker相关的内容存储在 /var/lib/docker/, 包括镜像(images), 容器(containers), 卷(volumes),网络(networks)等。 这些Docker相关的包统称之为 docker-ce


安装docker engine [CentOS]

使用repository安装

安装仓库
  • 安装yum-utils (包含 yum-config-manager)
    sudo yum install -y yum-utils
    
  • 安装 reposityory
     yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
安装docker engine
  • 最新版本的安装

    yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  • 安装某个版本

查询版本号
yum list docker-ce --showduplicates | sort -r
image-20220506153237978.png

例如:版本号就是 docker-ce-18.09.1

yum install docker-ce- docker-ce-cli- containerd.io docker-compose-plugin

启动docker

 sudo systemctl start docker

Hello-world

sudo docker run hello-world

启动 docker/getting-started 教程

 docker run -d -p 80:80 docker/getting-started

参数说明

  • -d - run the container in detached mode (in the background)
  • -p 80:80 - map port 80 of the host to port 80 in the container
  • docker/getting-started - the image to use

创建示例工程

代码编写

https://github.com/docker/getting-started/tree/master/app

构建镜像

  • 创建Dockerfile文件。Dockerfile文件不能有任何的后缀。(此例在package.json所在目录下创建Dockerfile文件)
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
`CMD` 命令表示当容器从镜像启动时运行的默认命令
  • 构建镜像
docker build -t getting-started .
`-t` flag tags our image; 最后的 . 表示Dockerfile文件所在的目录是当前目录

启动容器

docker run -dp 3000:3000 getting-started

http://ip:3000 就可以启动应用了 (防火墙注意放开3000的端口号)


更新示例工程

更新代码

重新构建

## 可以在最后增加:tagName
docker build -t getting-started .

停止旧版本

## 查找正在运行的旧版本的container id
docker ps
## 停止旧版本
docker stop 
## 删除旧版本
docker rm 

重新启动

docker run -dp 3000:3000 getting-started

推送镜像到远程仓库

  • 操作Docker Hub

    1. 注册登陆 Docker Hub.
    2. 创建仓库,仓库名与需要推送的image名需要一致
  • 本地操作

       1. 登陆上一步创建的账号
    
          ```shell
          docker login -u YOUR-USER-NAME
          ```
    
       2. 确保image名字与上一步的仓库名一致,如果有需要可以重命名
    
          ```shell
          ## 其中 :TAG_NAME 可以省略,则为 latest
          docker tag getting-started YOUR-USER-NAME/getting-started:TAG_NAME
          ```
    
       3. 推送
    
          ```shell
          docker push YOUR-USER-NAME/getting-started
          ```
    

在线运行镜像

Open your browser to Play with Docker.


容器持久化数据 —— Named Volumes

每个容器的文件是系统是相互独立的,即使是由同一个镜像启动的容器的文件也是相互隔离的。可以通过挂载volume 来实现

  1. 创建volume

    docker volume create todo-db
    
  2. 启动时挂载

     docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
    

操作完以,重新停止,删除容器,用相同的命令启动docker时,数据就不会丢失。

查询volume挂载后,数据实际存在的位置

docker volume inspect todo-db
image-20220507113026889.png

容器持久化数据 —— Bind Mounts

用的代码是上述示例工程的代码

docker run -dp 3000:3000 -w /code/app -v "$(pwd):/code/app" node:12-alpine sh -c "yarn install && yarn run dev"
  • -dp 3000:3000 - same as before. Run in detached (background) mode and create a port mapping
  • -w /app - sets the “working directory” or the current directory that the command will run from
  • -v "$(pwd):/app" - bind mount the current directory from the host in the container into the /app directory (主机地址与容器地址的映射关系:前是本机地址,:后是容器里的工作目录)
  • node:12-alpine - the image to use. Note that this is the base image for our app from the Dockerfile
  • sh -c "yarn install && yarn run dev" - the command. We’re starting a shell using sh (alpine doesn’t have bash) and running yarn install to install all dependencies and then running yarn run dev. If we look in the package.json, we’ll see that the dev script is starting nodemon.

基于多个容器的app

如果想把示例app的数据存储到mysql中。这时的app像这样。

multi-app-architecture.png

因为容器之间是相互隔离的,两个容器之间要进行信息交互就得通过网络(两个容器需要在同一个网络一起)。There are two ways to put a container on a network: 1) Assign it at start or 2) connect an existing container.

创建网络

 docker network create todo-app

启动mysql

启动mysql并连接到上一步创建的网络中

docker run -d  --network todo-app --network-alias mysql  -v todo-mysql-data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=root   -e MYSQL_DATABASE=todos  mysql:5.7

其中--network 表示运行的网络是 todo-app

其中的 --network-alias 对网络起了一个别名,后续可以直接使用这个别名。

验证mysql是否启动成功

docker exec -it  mysql -u root -p

寻找mysql容器的ip地址

mysql容器已经运行起来了,怎么找到mysql容器的ip地址呢(每个容器都有它自己的ip地址)?

我们可以运用 nicolaka/netshoot 这个容器来寻址。

  • 启动netshoot

    docker run -it --network todo-app nicolaka/netshoot
    
  • 进入容器后,可以使用 dig 这个命令来查询mysql的ip地址。(dig是一个很有用的DNS工具)

    dig mysql
    

    运行结果:

    ;; ANSWER SECTION:
     mysql.           600 IN  A   172.23.0.2
    

    这条记录就是ip解析结果。虽然mysql不是一个正常的主机名,之所以能解析到是因为上一步的--network-alias设置了mysql。这使我们的app如果想连到mysql的话,这需要运用这个主机名mysql就可以。

启动基于mysql的app

docker run -dp 3000:3000 \
   -w /app -v "$(pwd):/app" \
   --network todo-app \
   -e MYSQL_HOST=mysql \
   -e MYSQL_USER=root \
   -e MYSQL_PASSWORD=root \
   -e MYSQL_DB=todos \
   node:12-alpine \
   sh -c "yarn install && yarn run dev"

打开浏览器增加一些纪录时,这时候的数据会存到mysql中。

也可以直接启动上面章节构建的镜像

docker run -dp 3000:3000 --network todo-app -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD=root  -e MYSQL_DB=todos   getting-started

使用docker-compose启动app

安装docker-compose

  • 下载可执行文件 release page
  • 下载的文件重命名为docker-cmpose
  • 移动到/usr/bin/docker-compose目录
  • 赋予可执行权限 chmod +x /usr/bin/docker-compose
  • 验证版本号 docker-compose version

创建docker-compose.yml文件

  • 默认情况下,这个工程的名字是这个文件所在文件夹的名字

  • 在项目的根目录下创建docker-compose.yml文件

  • 在这个文件的最开头部分定义版本号,不同版本号的兼容情况可以查看compose version

     version: "3.7"
    
  • 接下来定义启动app需要的不同的services (or containers)

     version: "3.7"
    
     services:
    

定义自己应用的 service

  • 定义第一个service名字(app)和镜像,其中service名字任意取,这个名字会自动成为一个network alias。这对我们定义mysql服务很有效

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
    
  • 通常来说,紧接着image下面会设置command,但是对它们出现的先后顺序并没有要求

    version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
    
  • 设置端口号,设置端口号有两种方式:一种是短语法;一种是长语法

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
    
  • 定义工作目录与volume ,volume的定义也有两种方式:short 和 long。在这里定义volumes时可以直接运用相对路径

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
         working_dir: /app
         volumes:
           - ./:/app
    
  • 定义镜像的环境变量

     version: "3.7"
    
     services:
       app:
         image: node:12-alpine
         command: sh -c "yarn install && yarn run dev"
         ports:
           - 3000:3000
         working_dir: /app
         volumes:
           - ./:/app
         environment:
           MYSQL_HOST: mysql
           MYSQL_USER: root
           MYSQL_PASSWORD: root
           MYSQL_DB: todos
    

定义mysql service

  • 将mysql service 服务命名为mysql,这样自动生成的network alias也是mysql;指定mysql服务的镜像为mysql:5.7

     version: "3.7"
    
     services:
       app:
         # The app service definition
       mysql:
         image: mysql:5.7
    
  • 定义mysql service 的named volumes。

    基于Compose的volumes并不像使用docker run 会自动创建named volumes。当在使用Compose时需要在配置文件顶层中申明volumes:。而在具体的服务下的volumes:是用来指定这个服务的挂载点的。

     version: "3.7"
    
     services:
       app:
         # The app service definition
       mysql:
         image: mysql:5.7
         volumes:
           - todo-mysql-data:/var/lib/mysql
    
     volumes:
       todo-mysql-data:
    
  • 定义mysql的环境变量

     version: "3.7"
    
     services:
       app:
         # The app service definition
       mysql:
         image: mysql:5.7
         volumes:
           - todo-mysql-data:/var/lib/mysql
         environment:
           MYSQL_ROOT_PASSWORD: secret
           MYSQL_DATABASE: todos
    
     volumes:
       todo-mysql-data:
    

完整的docker-compose.yml文件

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

使用docker-compose关闭app

进入docker-compose.yml文件所在的目录,运行

docker-compose down

默认情况下容器(containers)与网络(network)会被停止与删除。但是创建的volumes不会被删除,如果想要删除的话加入--volumes参数。

你可能感兴趣的:(Docker安装与运行自定义镜像-CentOS)