Docker笔记(一)

163 阅读7分钟

内容

Docker是什么、能做什么、如何在linux服务器上安装docker、配置阿里云镜像加速器、了解容器的常用操作、基于docker运行tomcat,mysql、当需要安装一个新的容器的时候如何做、在阿里云创建一个镜像仓库然后提交,拉取镜像

docker介绍

docker官网

官网首页:我们帮助开发人员和开发团队构建和发布应用程序

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到Linux机器上。可以避免开发时运行环境和运行时环境不一致导致的问题。

Docker架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。包括三个基本概念:

镜像(Image):将软件环境打包好的模板,用来创建容器的。一个镜像可以创建多个容器

容器(Container):启动一个镜像就是一个容器,容器与容器之间相互隔离,并且互不影响。 容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次 在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

linux服务器上安装docker

全程使用阿里云的服务器来操作。以centos7为例,Docker 要求操作系统必须为64位,且centos内核版本为3.1及以上。

查看系统内核uname -r。当前内核版本3.10.0-514.26.2.el7.x86_64

  1. 安装软件依赖包

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  2. 设置yum源

    1. 官方源

      yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      
    2. 阿里云

      yum-config-manager \
          --add-repo \
          http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
  3. 安装docker-ce

    yum install docker-ce -y
    
    1. 查看所有版本yum list docker-ce.x86_64 --showduplicates | sort -r
    2. 安装指定版本yum install docker-ce-<VERSION_STRING> -y
  4. 完成安装后可以使用docker version查看安装的版本

配置阿里云镜像加速器

​ 这里使用阿里云的免费镜像加速服务

  1. 注册登录并开通容器镜像服务

  2. 查看控制台并找到镜像加速器

3.1 可以直接复制官方提供的shell命令。注意填写自己的加速器地址

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://85ghluhq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3.2 可以修改daemon配置文件/etc/docker/daemon.json来使用加速器

  1. 修改daemon配置文件/etc/docker/daemon.json

    {
      "registry-mirrors": ["https://85ghluhq.mirror.aliyuncs.com"]
    }
    
  2. 通知systemd重载此配置文systemctl daemon-reload

  3. 重启docker服务systemctl restart docker

Docker的常用操作

镜像的常用操作

查找镜像,搜索docker hub网站镜像的详细信息

​ docker search 关键字

​ 下载镜像,Tag表示版本,有些镜像的版本显示latest,为最新版本

docker pull 镜像名:TAG

删除镜像,-f 表示强制删除

docker rmi -f 镜像ID或者镜像名:TAG

查看本地镜像列表

docker image list

获取元信息

docker inspect 镜像ID或者镜像名:TAG

容器的常用操作

运行

docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像ID或镜像名:TAG 
# --name 指定容器名,可自定义,不指定自动命名 
# -i 以交互模式运行容器 
# -t 分配一个伪终端,即命令行,通常-it组合来使用 
# -p 指定映射端口,讲主机端口映射到容器内的端口 
# -d 后台运行容器 
# -v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只

容器列表

docker ps -a -q 
# docker ps查看正在运行的容器 
# -a 查看所有容器(运行中、未运行) 
# -q 只查看容器的ID 

启动容器

docker start 容器ID或容器名

停止容器

docker stop 容器ID或容器名

删除容器

docker rm -f 容器ID或容器名 
# -f 表示强制删除

查看日志

docker logs 容器ID或容器名

进入正在执行的容器

docker exec -it 容器ID或者容器名 /bin/bash 
# 进入正在运行的容器并且开启交互模式终端 
# /bin/bash是固有写法,作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash。 

拷贝文件

#主机中文件拷贝到容器中 
docker cp 主机文件路径 容器ID或容器名:容器路径 

#容器中文件拷贝到主机中
docker cp 容器ID或容器名:容器路径 主机文件路径 

获取容器元信息

docker inspect 容器ID或容器名

查看容器端口

docker port 容器ID或容器名

基于docker运行tomcat,mysql

通过拉取tomcat、mysql镜像并启动来使用docker命令

运行tomcat

拉取tomcat镜像 docker pull tomcat

查看拉取的tomcat镜像 docker image list

运行tomcat docker run --name mytomcat -it -d -p 80:8080 tomcat

查看运行情况 docker ps -a

查看tomcat的日志 docker logs mytomcat

mytomcat容器已经运行,根据ip地址访问404。进入容器查看webapps

可以看到webapps下是空的,404就不是很意外了。先删除webapps,再执行命令cp -r webapps.dist/ webapps 把webapps.dist里的内容拷贝到webapps里。

重启一下mytomcat容器 docker restart mytomcat,发现访问还是404。这就尴尬了,吃个饭等它一会,回来后发现竟然能访问到tomcat首页了。这可怎么办?查看一下mytomcat容器的日志 docker logs mytomcat

使用[SHA1PRNG]创建securerrandom实例生成session ID花费了[678,407]毫秒。

具体原因就不说了,直接上解决办法

1.tomcat镜像使用的是最新版本,内置的jdk使用的是jdk11.首先找到JAVA_HOME目录。 echo $JAVA_HOME。在该目录下的conf/security/java.security 中

# 修改前
securerandom.source=file:/dev/random
# 修改后
securerandom.source=file:/dev/./urandom

先把文件拷贝出来,修改完成后再拷贝回去

在容器/usr/local/openjdk-11/conf/security/使用 more +/securerandom java.security查看是否修改成功

重启容器,就可以直接访问了。

2.由于直接修改镜像文件里的文件太过暴力,还提供了另一种解决方案,在镜像创建时使用-v命令来覆盖此文件

docker run --name mytomcat -p 80:8080 -d -v /etc/docker/java.security:/usr/local/openjdk-11/conf/security/java.security tomcat

此处需要使用绝对路径。重新生成镜像后webapps文件夹里是空的

运行mysql

拉取mysql5.7版本 docker pull mysql:5.7 ,这里就直接开始启动了。

docker run --name mysql5.7 -p 3306:3306 -d mysql:5.7

结果发现没启动。

在Docker Hub中搜索查找mysql。

mysql启动时需要指定初始密码 -e MYSQL_ROOT_PASSWORD=my-secret-pw

docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入容器连接mysql

由于编码问题,存储中文字符会报错,我们需要修改配置文件

使用自定义的配置文件

MySQL的默认配置可以在/etc/mysql/my.cnf中找到,可以使用-v来覆盖配置文件

存储的数据

/var/lib/mysql存储数据的地方

启动时配置

创建/mysql/data 和 /mysql/conf,

docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /mysql/conf/

启动命令

docker run --name mysql5.7 
-p 3306:3306 
-v /mysql/conf:/etc/mysql/mysql.conf.d 
-v /mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 
-d mysql:5.7

启动一个新的容器的时候如何做

直接上DockerHub搜索镜像,然后查看镜像的Description

将构建的镜像提交到阿里云的镜像仓库

创建阿里云镜像仓库

  1. 登录阿里云的容器镜像服务

  2. 点击个人版,进入仓库管理,点击创建命名空间

  3. 进入镜像仓库,创建镜像仓库。

    私有的话只有自己可以看到,公开的话可以在镜像搜索里查找

  4. 选择本地仓库,创建完成

提交镜像

点击仓库查看基本信息,里面包括操作指南。下面根据操作指南提交镜像

登录阿里云Docker Registry, 用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

docker login --username=夜幕挽歌滴答滴答 registry.cn-shanghai.aliyuncs.com

将镜像推送到Registry。

# 阿里云api
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/xiaoludan/myrepository:[镜像版本号]
# 替换后
docker tag 8652b9f0cb4c registry.cn-shanghai.aliyuncs.com/xiaoludan/myrepository:v1

执行完成后会生成一个新的镜像

推送

# 阿里云api
docker push registry.cn-shanghai.aliyuncs.com/xiaoludan/myrepository:[镜像版本号]
# 替换后
docker push registry.cn-shanghai.aliyuncs.com/xiaoludan/myrepository:v1

拉取镜像

# 阿里云api
docker pull registry.cn-shanghai.aliyuncs.com/xiaoludan/myrepository:[镜像版本号]
# 替换后
docker pull registry.cn-shanghai.aliyuncs.com/xiaoludan/myrepository:v2