sudo apt-get -y install docker.io

安装完成后执行 docker,表明安装成功。

 

sudo docker pull ubuntu

安装完成之后默认会启动docker服务,如果没有启动和正常服务一样启动就好

docker pull ubuntu     #默认会拉取最新的docker镜像
docker run -it --rm ubuntu bash    #启动交互式的docker,运行完删除
docker image ls # 列出当前环境下的镜像
docker images   # 列出当前环境下的镜像
docker image rm ididididid      # 安装id删除镜像

操作容器

docker run -i -t --rm centos /bin/bash   # 启动一个centos容器并进入,此时容器是干干净净,没有一点东西的,do everything
docker container kill container_id    # 杀掉这个容器,强行终止
docker container rm container_id      # 删除这个容器
docker container ls            # 查找当前容器

 

$ docker ps // 查看所有正在运行容器
$ docker stop containerId // containerId 是容器的ID

$ docker ps -a // 查看所有容器
$ docker ps -a -q // 查看所有容器ID

$ docker stop $(docker ps -a -q) //  stop停止所有容器
$ docker  rm $(docker ps -a -q) //   remove删除所有容器

 

其效果如下,这里安装了两个docker环境,centos和 ubuntu,这里ubuntu大小89M,centos大小202M,

运行后每个环境都是一个独立的linux环境,非常干净,对于部署非常方便。

 

 

 

 

第三十七章 springboot+docker(手动部署)

一、下载centos镜像

  • docker pull hub.c.163.com/library/centos:latest
  • docker tag containId centos:7
  • docker run -i -t -v /Users/enniu1/Desktop/docker-data/software:/mnt/software centos:7
    • -i:以"交互模式"运行容器
    • -t:表示容器启动后会进入其命令行
    • -v:数据卷,这里将宿主机的/Users/enniu1/Desktop/docker-data/software目录(宿主机存放软件目录)挂载到容器的/mnt/software目录(容器存放软件目录)
      • 这里是为了让容器直接共享宿主机的/Users/enniu1/Desktop/docker-data/software目录下的软件

二、宿主机下载jdk之后移动到/Users/enniu1/Desktop/docker-data/software

三、容器内解压jdk

  • cd /opt
  • tar -zxf /mnt/software/jdk-8u102-linux-x64.tar.gz -C .
    • 将/mnt/software/jdk-8u102-linux-x64.tar.gz(直接共享的宿主机的挂载目录)解压到当前目录

四、设置环境变量

  • vi ~/.bashrc,添加如下两句
    • export JAVA_HOME=/opt/jdk
    • export PATH=$PATH:$JAVA_HOME/bin
  • source ~/.bashrc
    • 使文件生效
  • java -version进行测试

五、创建自己的镜像:zjg/jdk8:v1.0(第一种创建镜像的方式)

  • exit退出容器
  • docker commit 86e6187ea166 -m"install jdk8 to centos7" zjg/jdk8:v1.0
    • 86e6187ea166:原本的centos的容器id
    • zjg/jdk8:v1.0:镜像名与tag

六、编写代码并使用maven install为jar包,拷贝到与Dockerfile相同的包下

建立一个简单的springboot项目即可。

二者均在/Users/enniu1/Desktop/docker-data/file目录下

七、编写Dockfile文件

复制代码

 1 #first java application
 2 
 3 FROM zjg/jdk8:v1.0
 4 
 5 ADD myservice1-docker-1.0-SNAPSHOT.jar /opt/jar/
 6 
 7 ENV JAVA_HOME /opt/jdk
 8 ENV PATH $PATH:$JAVA_HOME/bin
 9 
10 CMD ["java","-jar","/opt/jar/myservice1-docker-1.0-SNAPSHOT.jar"]

复制代码

说明:

  • #注释
  • FROM zjg/jdk8:v1.0
    • 基于哪个镜像进行创建
  • ADD myservice1-docker-1.0-SNAPSHOT.jar /opt/jar/
    • 将宿主机的myservice1-docker-1.0-SNAPSHOT.jar拷贝到容器的/opt/jar/目录下
      • 注意:这里的myservice1-docker-1.0-SNAPSHOT.jar最好与Dockerfile在同一个文件夹下,否则可能有问题(使用绝对路径和相对Dockerfile的路径都有问题)
      • 注意:/opt/jar/必须带有后边的"/"(目录),如果是/opt/jar这样的话,容器会创建一个jar文件而非目录
  • ENV JAVA_HOME /opt/jdk
  • ENV PATH $PATH:$JAVA_HOME/bin
  • CMD ["java","-jar","/opt/jar/myservice1-docker-1.0-SNAPSHOT.jar"]
    • 容器启动之后,执行"java -jar /opt/jar/myservice1-docker-1.0-SNAPSHOT.jar"

八、创建服务镜像(第二种创建镜像的方式)

  • docker build -t="zjg/myservice1docker:v1.1" /Users/enniu1/Desktop/docker-data/file
    • -t:指定镜像名与tag
    • /Users/enniu1/Desktop/docker-data/file:dockerfile所在的目录

build日志如下:

复制代码

 1 Sending build context to Docker daemon  13.8 MB
 2 Step 1 : FROM zjg/jdk8:v1.0
 3  ---> e7b4cf41e531
 4 Step 2 : ADD myservice1-docker-1.0-SNAPSHOT.jar /opt/jar/
 5  ---> ea8401c3ee2e
 6 Removing intermediate container da2e0b518a1f
 7 Step 3 : ENV JAVA_HOME /opt/jdk
 8  ---> Running in db5d6bed3872
 9  ---> 2c123cd7d20f
10 Removing intermediate container db5d6bed3872
11 Step 4 : ENV PATH $PATH:$JAVA_HOME/bin
12  ---> Running in 66bbcdf76dfb
13  ---> 38ce4cac8d38
14 Removing intermediate container 66bbcdf76dfb
15 Step 5 : CMD java -jar /opt/jar/myservice1-docker-1.0-SNAPSHOT.jar
16  ---> Running in 9359f360c777
17  ---> 1bbfc1635a71
18 Removing intermediate container 9359f360c777
19 Successfully built 1bbfc1635a71

复制代码

每一个step都会创建一层镜像,以上就会创建五层镜像,在删除镜像的时候就会看出,会删除五层镜像。

  • docker images

九、启动测试

  • docker run -d -p 8014:8080 1bbfc1635a71
  • 浏览器访问:localhost:8014/docker/hello(自己springboot项目中的一个controller路径)

 

Mysql 镜像安装

 

下载镜像
docker pull mysql/mysql-server
mkdir /var/skylark/data/mysql

启动镜像并初始化
docker run -it --name vis_mysql -v /var/skylark/data/mysql:/var/lib/mysql:rw -e MYSQL_ROOT_PASSWORD=CDyouE@2019 -p 3306:3306 mysql/mysql-server

进入镜像内部
docker exec -it vis_mysql /bin/bash

连接mysql

mysql -uroot -ptangheng

查看mysql版本
select @@version;

8.x版本以上使用下面语句设置远程连接
create user 'root'@'%' identified by 'CDyouE@2019';
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;

更新密码规则
ALTER USER 'root'@'localhost' IDENTIFIED BY 'CDyouE@2019' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED BY 'CDyouE@2019' PASSWORD EXPIRE NEVER;

将8.x默认身份验证由caching_sha2_password修改为mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'CDyouE@2019';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'CDyouE@2019';

 

运行命令:

docker run -it --name vis_mysql -v /var/skylark/data/mysql:/var/lib/mysql:rw -e MYSQL_ROOT_PASSWORD=tangheng -p 3306:3306 mysql/mysql-server
docker exec -it vis_mysql /bin/bash
mysql -uroot -ptangheng
create user 'root'@'%' identified by 'tangheng';

grant all privileges on *.* to 'root'@'%' with grant option;

flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'tangheng' PASSWORD EXPIRE NEVER;

ALTER USER 'root'@'%' IDENTIFIED BY 'tangheng' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'tangheng';

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'tangheng';

 

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

1、从容器里面拷文件到宿主机?

     答:在宿主机里面执行以下命令

             docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 

     示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,  现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?

     答案:在宿主机上面执行命令

docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt

2、从宿主机拷文件到容器里面

      答:在宿主机里面执行如下命令

              docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

       示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?

       答案:在宿主机上面执行如下命令     

docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js

3、在这里在记录一个问题,怎么看容器名称?

      执行命令:docker ps,出现如图所示,其中NAMES就是容器名了。

 4.需要注意的是,不管容器有没有启动,拷贝命令都会生效。

 

 

Docker中容器的备份、恢复和迁移

1. 备份容器

首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表。要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命令。

  1. # docker ps

Docker Containers List

Docker Containers List

在此之后,我们要选择我们想要备份的容器,然后去创建该容器的快照。我们可以使用 docker commit 命令来创建快照。

  1. # docker commit -p 30b8f18f20b4 container-backup

Docker Commit

Docker Commit

该命令会生成一个作为Docker镜像的容器快照,我们可以通过运行 docker images 命令来查看Docker镜像,如下。

  1. # docker images

Docker Images

Docker Images

正如我们所看见的,上面做的快照已经作为Docker镜像保存了。现在,为了备份该快照,我们有两个选择,一个是我们可以登录进Docker注册中心,并推送该镜像;另一个是我们可以将Docker镜像打包成tar包备份,以供今后使用。

如果我们想要在Docker注册中心上传或备份镜像,我们只需要运行 docker login 命令来登录进Docker注册中心,然后推送所需的镜像即可。

  1. # docker login

Docker Login

Docker Login

  1. # docker tag a25ddfec4d2a arunpyasi/container-backup:test
  2. # docker push arunpyasi/container-backup

Docker Push

Docker Push

如果我们不想备份到docker注册中心,而是想要将此镜像保存在本地机器中,以供日后使用,那么我们可以将其作为tar包备份。要完成该操作,我们需要运行以下 docker save 命令。

  1. # docker save -o ~/container-backup.tar container-backup

taking tarball backup

taking tarball backup

要验证tar包是否已经生成,我们只需要在保存tar包的目录中运行 ls 命令即可。

 

2. 恢复容器

接下来,在我们成功备份了我们的Docker容器后,我们现在来恢复这些制作了Docker镜像快照的容器。如果我们已经在注册中心推送了这些Docker镜像,那么我们仅仅需要把那个Docker镜像拖回并直接运行即可。

  1. # docker pull arunpyasi/container-backup:test

Docker Pull

Docker Pull

但是,如果我们将这些Docker镜像作为tar包文件备份到了本地,那么我们只要使用 docker load 命令,后面加上tar包的备份路径,就可以加载该Docker镜像了。

  1. # docker load -i ~/container-backup.tar

现在,为了确保这些Docker镜像已经加载成功,我们来运行 docker images 命令。

  1. # docker images

在镜像被加载后,我们将用加载的镜像去运行Docker容器。

  1. # docker run -d -p 80:80 container-backup

Restoring Docker Tarball

Restoring Docker Tarball

 

3. 迁移Docker容器

迁移容器同时涉及到了上面两个操作,备份和恢复。我们可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,首先我们将把容器 备份为Docker镜像快照。然后,该Docker镜像或者是被推送到了Docker注册中心,或者被作为tar包文件保存到了本地。如果我们将镜像推送 到了Docker注册中心,我们简单地从任何我们想要的机器上使用 docker run 命令来恢复并运行该容器。但是,如果我们将镜像打包成tar包备份到了本地,我们只需要拷贝或移动该镜像到我们想要的机器上,加载该镜像并运行需要的容器 即可。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐