docker学习和使用

概述

在ubuntu18下学习使用docker

安装

参考官方网站安装方法(docker安装方法)。使用阿里云镜像加速。

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

docker部署mysql

wangzheng@wangzheng-ubuntu:~$ docker images mysql
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wangzheng@wangzheng-ubuntu:~$

拉取mysql镜像

wangzheng@wangzheng-ubuntu:~$ docker pull mysql:5.6
5.6: Pulling from library/mysql
177e7ef0df69: Pull complete 
cac25352c4c8: Pull complete 
8585afabb40a: Pull complete 
1e4af4996053: Pull complete 
c326522894da: Pull complete 
50ec9776c6b3: Pull complete 
b81a89945365: Pull complete 
80f5ab6567ca: Pull complete 
5caf5e4c5eb0: Pull complete 
9295ceea71e2: Pull complete 
fb029976ca26: Pull complete 
Digest: sha256:3188255bd739bfb6a8d964f21a314ce618205afb2c51f4a57e87019163c5ca34
Status: Downloaded newer image for mysql:5.6
wangzheng@wangzheng-ubuntu:~$ docker images mysql
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.6                 27e29668a08a        13 days ago         256MB
wangzheng@wangzheng-ubuntu:~$ 

运行mysql容器

wangzheng@wangzheng-ubuntu:~$ docker run -p 12345:3306 --name mysql -v /home/wangzheng/mysql/conf:/etc/mysql/conf.d -v /home/wangzheng/mysql/logs:/logs -v /home/wangzheng/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=111111 -d mysql:5.6
399ac7866dbb310ffb8a2868fa4292248567c080f398715136c2fa8ce6b41287
wangzheng@wangzheng-ubuntu:~$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
399ac7866dbb        mysql:5.6           "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:12345->3306/tcp   mysql
wangzheng@wangzheng-ubuntu:~$

命令说明:
-p 12345:3306:将容器的 3306 端口映射到主机的 12345 端口。
-v /home/wangzheng/mysql/conf:/etc/mysql/conf.d:将主机/home/wangzheng/mysql/目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v /home/wangzheng/mysql/logs:/logs:将主机/home/wangzheng/mysql/目录下的 logs 目录挂载到容器的 /logs。
-v /home/wangzheng/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=111111:初始化 root 用户的密码。

进入mysql数据库,查看版本

wangzheng@wangzheng-ubuntu:~$ docker exec -it 399ac7866dbb /bin/bash
root@399ac7866dbb:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.42 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql> 

创建测试数据库和表

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> create table user(id int not null primary key,name varchar(20));
Query OK, 0 rows affected (0.05 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql> insert into user values('1','user1');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
+----+-------+
1 row in set (0.00 sec)

mysql>

使用nnavicat premium外部连接数据库,查询数据库数据
在这里插入图片描述
插入数据user2
在这里插入图片描述
查询数据库


mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
|  2 | user2 |
+----+-------+
2 rows in set (0.00 sec)

mysql> 

备份整个数据库

wangzheng@wangzheng-ubuntu:~$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
399ac7866dbb        mysql:5.6           "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:12345->3306/tcp   mysql
wangzheng@wangzheng-ubuntu:~$ docker exec 399ac7866dbb sh -c 'exec mysqldump --all-databases -uroot -p111111' > /home/wangzheng/all-database.sql
Warning: Using a password on the command line interface can be insecure.
wangzheng@wangzheng-ubuntu:~$ ls -l all-database.sql 
-rw-rw-r-- 1 wangzheng wangzheng 3321101 1月  11 10:30 all-database.sql
wangzheng@wangzheng-ubuntu:~$ 

Dockerfile学习及使用

docker镜像除了通过命令行手工创建还可以通过Dockerfile自动创建。

Dockerfile 命令

Dockerfile有十几条命令可用于构建镜像:

指令的一般格式为 INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN 等。

  • FROM

格式为 FROM [image]或FROM [image]:[tag]。

第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。

  • MAINTAINER

格式为 MAINTAINER [name],指定维护者信息。

  • RUN

格式为 RUN [command] 或 RUN [“executable”, “param1”, “param2”]。

前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN ["/bin/bash", “-c”, “echo hello”]。
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。

  • CMD

支持三种格式
CMD [“executable”,“param1”,“param2”] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD [“param1”,“param2”] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

  • EXPOSE

格式为 EXPOSE [port] [[port]…]。

告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。

  • ENV

格式为 ENV [key] [value]。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
例如
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-KaTeX parse error: Expected 'EOF', got '&' at position 49: …/src/postgress &̲& … ENV PATH /u…PG_MAJOR/bin:$PATH

  • ADD

格式为 ADD [src] [dest]。

该命令将复制指定的 [src] 到容器中的 [dest]。 其中 [src] 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

  • COPY

格式为 COPY [src] [dest]。

复制本地主机的 [src](为 Dockerfile 所在目录的相对路径)到容器中的 [dest]。
当使用本地目录为源目录时,推荐使用 COPY。

  • ENTRYPOINT

两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2(shell中执行)。

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

  • VOLUME

格式为 VOLUME ["/data"]。

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

  • USER

格式为 USER daemon。

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而不推荐 sudo。

  • WORKDIR

格式为 WORKDIR /path/to/workdir。

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。

  • ONBUILD

格式为 ONBUILD [INSTRUCTION]。

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile 使用如下的内容创建了镜像 image-A。
[…]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[…]
如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。
FROM image-A #Automatically run the followingADD . /app/srcRUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。

创建镜像

编写完Dockerfile文件后,通过运行docker build命令来创建自定义的镜像。Docker build命令格式如下:

docker build [options]

该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。也可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。

实现Dockerfile创建tomcat8镜像

  1. 首先准备好tomcat和jre的安装包
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ pwd
/home/wangzheng/myDocker/tomcat8
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ ls
apache-tomcat-8.5.6.tar.gz  c.txt  Dockerfile  jdk-8u152-linux-x64.tar.gz
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$
  1. 编写Dockerfile
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ cat Dockerfile 
# 基础镜像
FROM centos
# 维护者
MAINTAINER wangzheng<[email protected]>
# 拷贝c.txt到/usr/local/cincontainer.txt
COPY c.txt /usr/local/cincontainer.txt
# 拷贝jdk和tomcat到/usr/local(并解压缩)
ADD jdk-8u152-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.6.tar.gz /usr/local
# yum安装vim
RUN yum -y install vim
# 设置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 设置环境变量
ENV JAVA_HOME $MYPATH/jdk1.8.0_152
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME $MYPATH/apache-tomcat-8.5.6
ENV CATALINA_BASE $MYPATH/apache-tomcat-8.5.6
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 对外暴露端口
EXPOSE 8080

# 启动时执行
CMD /usr/local/apache-tomcat-8.5.6/bin/startup.sh \
    && tail -f /usr/local/apache-tomcat-8.5.6/logs/catalina.out
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ 
  1. docker build 生成镜像mytomcat:1.0
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ docker build -f ./Dockerfile -t wz/mytomcat:1.0 .
Sending build context to Docker daemon  199.1MB
Step 1/15 : FROM centos
 ---> 1e1148e4cc2c
Step 2/15 : MAINTAINER wangzheng<[email protected]>
 ---> Running in 2469b1f684c6
Removing intermediate container 2469b1f684c6
 ---> 7632d853f8fa
Step 3/15 : COPY c.txt /usr/local/cincontainer.txt
 ---> 3ede4ae636db
Step 4/15 : ADD jdk-8u152-linux-x64.tar.gz /usr/local
 ---> 81a3f946e186
Step 5/15 : ADD apache-tomcat-8.5.6.tar.gz /usr/local
 ---> 2334edf03511
Step 6/15 : RUN yum -y install vim
 ---> Running in 026eab55151f
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.nwsuaf.edu.cn
 * extras: mirrors.nwsuaf.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.160-5.el7 will be installed
...
Complete!
Removing intermediate container 026eab55151f
 ---> 57778f4ba099
Step 7/15 : ENV MYPATH /usr/local
 ---> Running in 450cf798d336
Removing intermediate container 450cf798d336
 ---> 3b267f097aee
Step 8/15 : WORKDIR $MYPATH
 ---> Running in 28a43876d1e7
Removing intermediate container 28a43876d1e7
 ---> 757030f8e030
Step 9/15 : ENV JAVA_HOME $MYPATH/jdk1.8.0_152
 ---> Running in a601123021a9
Removing intermediate container a601123021a9
 ---> b9b0afaa0895
Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in 7eb65524f67f
Removing intermediate container 7eb65524f67f
 ---> 74d9732c2be2
Step 11/15 : ENV CATALINA_HOME $MYPATH/apache-tomcat-8.5.6
 ---> Running in 01709374b04c
Removing intermediate container 01709374b04c
 ---> e9e96a61aec8
Step 12/15 : ENV CATALINA_BASE $MYPATH/apache-tomcat-8.5.6
 ---> Running in 7e02fa34bd12
Removing intermediate container 7e02fa34bd12
 ---> ed5ba94aba42
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in 869b7a4a765c
Removing intermediate container 869b7a4a765c
 ---> dd8192ff9928
Step 14/15 : EXPOSE 8080
 ---> Running in f00f1ac4e36a
Removing intermediate container f00f1ac4e36a
 ---> f791a64bd003
Step 15/15 : CMD /usr/local/apache-tomcat-8.5.6/bin/startup.sh     && tail -f /usr/local/apache-tomcat-8.5.6/logs/catalina.out
 ---> Running in 5220b086dbf7
Removing intermediate container 5220b086dbf7
 ---> 464836fe2d6c
Successfully built 464836fe2d6c
Successfully tagged wz/mytomcat:1.0
  1. 查看镜像
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ docker images wz/mytomcat
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wz/mytomcat         1.0                 464836fe2d6c        7 minutes ago       725MB
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$
  1. 运行容器
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ docker run -p 8888:8080 -v /home/wangzheng/myDocker/tomcat8/test:/usr/local/apache-tomcat-8.5.6/webapps/test -v /home/wangzheng/myDocker/tomcat8/tomcatlogs:/usr/local/apache-tomcat-8.5.6/logs -d wz/mytomcat:1.0
99e62af423bba8cda514cd934976a7d448d8185bd7993e1cdd7fae3e060cff95
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
99e62af423bb        wz/mytomcat:1.0     "/bin/sh -c '/usr/lo…"   4 seconds ago       Up 3 seconds        0.0.0.0:8888->8080/tcp    boring_yalow
399ac7866dbb        mysql:5.6           "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:12345->3306/tcp   mysql
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8$
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/tomcatlogs$ pwd
/home/wangzheng/myDocker/tomcat8/tomcatlogs
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/tomcatlogs$ ls
catalina.2019-01-11.log  catalina.out  host-manager.2019-01-11.log  localhost.2019-01-11.log  localhost_access_log.2019-01-11.txt  manager.2019-01-11.log
  1. 浏览器访问http://192.168.0.69:8888/
    在这里插入图片描述
  2. 部署web项目至tomcat
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ ls
a.jsp  WEB_INF
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ pwd
/home/wangzheng/myDocker/tomcat8/test
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ cat a.jsp 
<html>
    <head>
               <title>第一个 JSP 程序</title>
     </head>
       <body>
	       <%="i am in docker tomcat self "%>
                  <% System.out.println("Hello World!");%>
	</body>
</html>
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$
  1. 重启容器
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
99e62af423bb        wz/mytomcat:1.0     "/bin/sh -c '/usr/lo…"   4 minutes ago       Up 4 minutes        0.0.0.0:8888->8080/tcp    boring_yalow
399ac7866dbb        mysql:5.6           "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:12345->3306/tcp   mysql
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ docker restart 99e62af423bb
  1. 浏览器访问http://192.168.0.69:8888/test/a.jsp
    在这里插入图片描述

使用docker commit从容器创建一个新的镜像

wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ docker commit -a wangzheng -m "tomcat with test webapps" 99e62af423bb wz/mytomcat:1.2
sha256:848ee7df8812b9abe5819960cdf42016977757429833bf73162167c25dba3831
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ docker images wz/mytomcat
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wz/mytomcat         1.2                 848ee7df8812        15 seconds ago      725MB
wz/mytomcat         1.0                 464836fe2d6c        2 hours ago         725MB
wangzheng@wangzheng-ubuntu:~/myDocker/tomcat8/test$ 

遇到的问题

问题1

wangzheng@wangzheng-ubuntu:~$ docker pull hello-world
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fhello-world%3Apull&service=registry.docker.io: dial tcp: lookup auth.docker.io on 127.0.0.53:53: server misbehaving

解决办法

网上所找到的解决办法都不能解决(网友博客)。经过排查发现是dns问题。
配置dns,将127.0.0.53改为8.8.8.8

wangzheng@wangzheng-ubuntu:~$ cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 8.8.8.8
wangzheng@wangzheng-ubuntu:~$ 

重启网卡

wangzheng@wangzheng-ubuntu:~$ sudo /etc/init.d/networking restart

问题解决

wangzheng@wangzheng-ubuntu:~$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

配置默认源为阿里源

wangzheng@wangzheng-ubuntu:~$ cat /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

更新源

wangzheng@wangzheng-ubuntu:~$ sudo apt-get update
wangzheng@wangzheng-ubuntu:~$ sudo apt-get upgrade

参考视频

https://www.bilibili.com/video/av27122140

猜你喜欢

转载自blog.csdn.net/wz122330/article/details/86153440
今日推荐