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镜像
- 首先准备好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$
- 编写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$
- 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
- 查看镜像
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$
- 运行容器
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
- 浏览器访问http://192.168.0.69:8888/
- 部署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$
- 重启容器
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
- 浏览器访问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