I am a system software engineer living in China now, but want to look for system/performance software engineer job in Singapore. If you have the opportunity, please contact me (email: nan#chinadtrace.org, replace ‘#’ with ‘@’), thanks in advance!
Recently, I am using
IntelliJ IDEA as a
Go IDE to browse Docker Swarm code. When I want to search where
Discovery.Watch method intoken package is called, the “
Alt+F7) function of
IntelliJ IDEA gives me a confusion:
It just prints one occurrence: the test code of
token package. It doesn’t make sense, where the hell is the
Discovery.Watch method called? When I search the usages of
Watch in Watcher interface which
token.Discovery satisfies by accident, I catch where the
Discovery.Watch method is used:
The caveat from this lesson is if you can’t find where methods of a package are called, you should try to find the interfaces where the packages satisfy, maybe it will give you the answer.
Sometimes, you just want to learn the internal mechanics of
Docker Swarm, but unfortunately there is only one
Linux box at hand, and you don’t want to bother to install Virtual Machines on it. In this scenario, you certainly can build a
Docker Swarm cluster on one host, and this tutorial will provide a detailed guide:
(1) Make sure the
Go environment has been ready on your system, if not, please follow this document to setup it. Also remember add
$PATH environment variable.
# go get -u github.com/docker/swarm
swarm command to check whether
Docker Swarm is well equipped:
# swarm Usage: swarm [OPTIONS] COMMAND [arg...] A Docker-native clustering system Version: 1.2.3 (HEAD) Options: --debug debug mode [$DEBUG] --log-level, -l "info" Log level (options: debug, info, warn, error, fatal, panic) --experimental enable experimental features --help, -h show help --version, -v print the version ......
(3) Modify the
Docker configuration file. E.g., on my
RHEL 7, the file is
# systemctl show docker ...... EnvironmentFile=/etc/sysconfig/docker (ignore_errors=yes) ......
-H tcp://127.0.0.1:2375” in
# cat /etc/sysconfig/docker # /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock'
Docker, and check whether the new
OPTIONS takes effect:
# systemctl restart docker # systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2016-06-08 12:32:19 CST; 10s ago Docs: http://docs.docker.com Main PID: 14429 (sh) CGroup: /system.slice/docker.service ├─14429 /bin/sh -c /usr/bin/docker-current daemon $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTI... ├─14430 /usr/bin/docker-current daemon --selinux-enabled -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock --add-registr... └─14431 /usr/bin/forward-journald -tag docker ......
(4) Run “
swarm create” command to create token for the cluster:
# swarm create d10eacbda9763b0740548a2a4c2f1a59
swarm join to create a
Docker Swarm node:
# swarm join --addr 127.0.0.1:2375 token://d10eacbda9763b0740548a2a4c2f1a59 INFO Registering on the discovery service every 1m0s... addr=127.0.0.1:2375 discovery=token://d10eacbda9763b0740548a2a4c2f1a59 ......
You should notice that the argument of
--addr option is the
IP and port of the
Docker engine on this host. Since we have set the
Docker configuration file in step
IP should be
127.0.0.1 whilst port is
(6) Open a new terminal, and create the manager of the cluster. Because port
2375 is occupied by
Docker engine, we use another available port:
# swarm manage -H 127.0.0.1:3375 token://d10eacbda9763b0740548a2a4c2f1a59 INFO Listening for HTTP addr=127.0.0.1:3375 proto=tcp INFO Registered Engine localhost.localdomain at 127.0.0.1:2375
Through the log, you can see the node and manager have communicated successfully.
Now, you can think a
Docker engine is listening on
tcp://127.0.0.1:3375, but actually, there is one
Docker cluster behind
tcp://127.0.0.1:3375, even though the cluster has only one node. You can play
docker client commands now, such as get the cluster info:
# docker -H tcp://127.0.0.1:3375 info Containers: 0 Images: 5 Server Version: swarm/1.2.3 Role: primary Strategy: spread Filters: health, port, containerslots, dependency, affinity, constraint Nodes: 1 localhost.localdomain: 127.0.0.1:2375 └ ID: ZUIV:BMPV:3B5R:2WBC:JXEI:2S6H:XM3H:66W5:UZQI:NJON:JY4T:HIFB └ Status: Healthy └ Containers: 0 (0 Running, 0 Paused, 0 Stopped) └ Reserved CPUs: 0 / 8 └ Reserved Memory: 0 B / 12.1 GiB └ Labels: executiondriver=native-0.2, kernelversion=3.10.0-327.el7.x86_64, operatingsystem=Red Hat Network, storagedriver=devicemapper └ UpdatedAt: 2016-06-08T04:58:05Z └ ServerVersion: 1.9.1 Kernel Version: 3.10.0-327.el7.x86_64 ......
Or run a container:
# docker -H tcp://127.0.0.1:3375 run hello-world Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. ......
Docker Swarm now!
Linux kernel has become one of the most gigantic and complex software project in the world, its complication scare many novices away. In this post, I will give some personal experience on how to learn
Linux kernel, and hope these tips can offer some help to newcomers.
(1) Download vanilla kernel and install it.
Yes, I suggest you can find a physical machine, or if you really don’t have one at hand, virtual machine is also OK. Download the newest vanilla kernel from kernel.org, then build and install it. This process isn’t too hard and makes you conquer the fear of
Linux kernel. After your first successful setting up of
Linux kernel, and read the release version number from
uname -r output:
# uname -r 4.6.0
I think this will enable you gain more confidence.
(2) Study the elementary skills of
Linux kernel programming.
Looking back when you begin user-space
C programming on
*nix platform, you need to know allocating memory through
malloc; opening file through
pthread library to construct concurrent program, and so on.
Linux is nothing more than a platform, and you also need to study the rules of playing with it. For example, you should be familiar with how to tweak list (
list.h); giving out memory should use
kmalloc, etc. There are many classical books and tutorials elaborate these knowledge. Although some posts seem outdated (the version of kernel is still
2.6.x.), but they are also applicable to current.
(3) Dive into one module.
Once you get the basic expertise of
Linux kernel programming, you should focus on one aspect of the kernel. If you are a full-time kernel programmer, congratulations! You should concentrate on your work area and try to be the expert of this domain. If kernel is just your hobby, you should select one module which you have great interest on. I.e., if you are curious about debugging,
kdump should be your taste; if you pay close attention to dynamic tracing,
BPF will be the right stuff which you want to find. After picking out the part you want to contribute, you should dig into the code and attempt to master every detail of it. You should also subscribe the related mailing list to acquaint the newest progress. The final goal is to check in meaningful patches for kernel, from a trivial typo to an enhanced feature. Think your code will run on millions of thousands of devices, it is really amazing!
When you meet an issue, you can try to get help from mailing list or forums. You can also try to take part in local community to recognize people in the same camp. Anyway, Endeavor to utilize all the resource you can find.